内存管理的几种方式(自己整理的一些资料,大牛勿喷)

Objective-c提供三种内存管理方式:
MRR:manual retain-release             手动管理
ARC:automatic reference counting      自动引用计数
GC:(mac os才支持)garbage collection    垃圾回收


MRR手动管理是基于引用计数的,当我们需要使用某块内存(对象),来改变这块内存的引用计数,一块内存的引用计数如果为零,那么它也没有使用者或是调用者,那么它就会被回收;


MRR遵循的几个简单的原则:
1、当你创建对象(alloc、new、copy....)初始的引用计数是1;
2、如果需要引用对象,可以给对象发送一个retain消息,这样对象计数器就加1
3、当不需要引用对象了,可以给对象发送release消息,这样对象计数器就减1
4、当计数器减到0,自动调用对象的dealloc函数,对象就会释放内存
5、计数器为0的对象不能再使用release和其他方法
6、不要释放或是覆盖正在使用的内存,会crash;
7、释放不在使用的内存,防止内存泄露;


AutoreleasePool是什么,如何工作 
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。 
1.  ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.


自动释放池(autorelease pool )是什么,如何工作?(于营 5遍)
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。 
1.  ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 
2. NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的. 
3. autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.


1、自动释放池是OC的一种内存自动回收机制,可以将一些变量或是临时变量通过自动释放池来统一回收;
2、当自动释放池销毁的时候,释放池里所有的对象都会做一次release的操作;
3、任何OC对象只要调用autorelease方法,就会把该对象放到离自己最近的自动释放池中(堆栈顶的释放池)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值