oc内存管理机制

引用计数器简介

每一个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,当对象的引用计数器为0时,那么这个对象就好被回收。系统判断对象是否要被回收就是根据引用计数器。

!引用计数器占用4个字节。

引用计数器的作用:

* 当使用alloc、new或者copy创建一个对象时,新对象的引用计数器默认就是1

* 当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收,话句话说,只要计数器不为零,那么对象在内存中就会一直存在

引用计数器的操作:

* 给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回本身)

* 给对象发送一条release消息,可以使引用计数器-1

* 可以给对象发送retainCount消息获得当前引用计数器的值

对象的销毁:

* 当一个计数器数值为0时,那么他将被销毁,其占用内存被系统回收

* 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息

* 一旦重写了dealloc方法,在这里和释放相关资源,dealloc就像对象的遗言

 

ARC的新规则(ARC Enforces New Rules): 

 为了正常运转,ARC使用了一些在使用其它编译模式下没有的新规则。这些规则意在提供完全可靠的内存管理模型;在某些情况下,它们仅使用最佳实践方法,在其它情况下,它们仅简化你的代码或明显的做出推论告知你不需要处理内存管理。如果你违反了这些规则,你会马上得到一个编译期错误,而不是在运行期可能会显现的一个狡猾的bug。 

1.不能显示的调用dealloc,实现或调用 retain, release, retainCount,或 autorelease。 
      同样也不要能使用 @selector(retain), @selector(release), 等等类似的选择器。
      如果你需要管理资源而不是释放实例变量,那你可以实现 dealloc方法。你不需要(事实上你不能)释放实例变量,但你可能需要在系统类和其它的未使用ARC代码中调用 [systemClassInstance setDelegate:nil] 方法。 
      在ARC中自定义的 dealloc方法不要调用 [super dealloc]方法(它实际上会导致编译器错误)。到super的链式调用是自动的并且是编译器强制执行的。你仍可以在Core Foundation样式的的对象上,使用CFRetain, CFRelease,和其它相关的函数。 

2.你不能使用 NSAllocateObject 或 NSDeallocateObject 
      你使用 alloc来创建对象;运行时系统会注意释放这些对象。 

3.你不能在C语言结构体中使用对象指针。 与其使用一个结构体( struct),不如创建一个Objective-C类来管理数据。 

 
4. id与 void*之间不能随意转换 
      你必须使用特定的类型转换来告诉编译器对象的生命周期。你需要在Objective-C对象和以函数参数传入的Core Foundation类型值之间进行这样的转换。有关详情,参见“Managing Toll-Free Bridging”

5.你不能使用 NSAutoreleasePool对象 
      ARC 提供了 @autoreleasepool来代替。这比 NSAutoreleasePool更高效。

6.你不能使用内存区(memory zones)。 
     再也没有使用 NSZone的必要了——现代的Obj-C运行时会永远忽略它。 
     为了允许与自动retain-release的代码进行交互,ARC在方法命名上加上了一个约束:
     你不能以 new为开头命名一个访问器的名字。这反过来意味着你不必声明一个以new开头的属性,除非你指定一个不同名称的getter方法: 

// Won't work: 
@property NSString *newTitle; 
// Works: 
@property (getter=theNewTitle) NSString *newTitle;

 

 

autorelease与自动释放池 

 

autorelease并不是根据作用域来决定释放时机的。那到底是依据什么呢?答案是:runloop。简单说,runloop就是iOS中的消息循环机制,当一个runloop结束时系统才会一次性清理掉被autorelease处理过的对象,其实本质上说是在本次runloop迭代结束时清理掉被本次迭代期间被放到autorelease pool中的对象的。至于何时runloop结束并没有固定的duration!

如何能及时的释放对象?我们把需要及时释放掉的代码块放入我们生成的autorelease pool中,结束后清空这个自定义的pool,主动地让pool清空掉,从而达到及时释放内存的目的

转载于:https://my.oschina.net/u/2381794/blog/739345

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值