IOS开发(77)之iOS高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
2013-05-14 09:33
357 查看
在前面分析了nomantic、copy、retain等属性之后,在教新的XCode版本中,我们又经常会看到__unsafe_unretain、__strong、__weak、__autoreleasing这四种属性,那么他们有什么用呢?
__unsafe_unretain、__strong、__weak、__autoreleasing是出现在 LLVM 编译器 3.0版本之后。而__unsafe_unretain、__strong、__autoreleasing可以在不使用ARC(自动参考计数)可用。在ARC下,默认的指针都是__strong属性。这意味着一个对象赋值给另外一个指针,那么只要指针参考了该对象,该对象就会一直保持。这对于大部分对象都实用,但是这可能会导致retain cycle。例如,你拥有一个对象包含了另外了一个实例变量对象,但是第二个对象又把前一个对象作为它的委托,那么这两个对象将不会被释放。
因为上面的原因,所以才有了__unsafe_unretain和__weak限定符存在。他们通常用来修饰delegate,即定义一个delegate的属性时,使用__unsafe_unretain和__weak来修饰,然后通过使用__unsafe_unretain和__weak来单独标记实例变量。这意味着delegate实例变量将仍然能够指向第一个对象,但是它不会导致保留第一个对象,因此打破了retain cycle,而能够释放两个对象
除了delegate,__unsafe_unretain和__weak修饰符也还能避免你的代码出现retain cycle。Leaks instrument现在包含了一个cycle视图,能够发现你的应用中的retain cycle,并图像显示出来。
__unsafe_unretain和__weak都能避免retain cycle,但是他们也有一些细微的不同。对于__weak,当释放指针指向的对象时,该对象的指针将转换为nil,这是比较安全的行为。而__unsafe_unretain,正如其名称隐藏的含义,尽管释放指针指向的对象时,该指针将继续指向原来的内存。这将会导致应用crash,所以是unsafe。
为什么我们仍要使用__unsafe_unretain呢?这是因为__weak直到iOS5.0以及lion之后才出现。
而__autoreleasing 的英文解释为:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用传参时使用。
最后需要注意的一点是:cocoa设定了一个规则,即父对象建立子对象的强引用,而子对象只对父对象建立弱引用。
而使用弱引用时需要注意,当你发消息给一个被dealloc的弱引用对象时,你的程序会崩毁。因此,必须细致地判断对象是否有效。多数情况下,被弱引用地对象是知道其他对象对它的弱引用的,所以当它自己dealloc时,需要通知对它弱引用的其他对象。
__unsafe_unretain、__strong、__weak、__autoreleasing是出现在 LLVM 编译器 3.0版本之后。而__unsafe_unretain、__strong、__autoreleasing可以在不使用ARC(自动参考计数)可用。在ARC下,默认的指针都是__strong属性。这意味着一个对象赋值给另外一个指针,那么只要指针参考了该对象,该对象就会一直保持。这对于大部分对象都实用,但是这可能会导致retain cycle。例如,你拥有一个对象包含了另外了一个实例变量对象,但是第二个对象又把前一个对象作为它的委托,那么这两个对象将不会被释放。
因为上面的原因,所以才有了__unsafe_unretain和__weak限定符存在。他们通常用来修饰delegate,即定义一个delegate的属性时,使用__unsafe_unretain和__weak来修饰,然后通过使用__unsafe_unretain和__weak来单独标记实例变量。这意味着delegate实例变量将仍然能够指向第一个对象,但是它不会导致保留第一个对象,因此打破了retain cycle,而能够释放两个对象
除了delegate,__unsafe_unretain和__weak修饰符也还能避免你的代码出现retain cycle。Leaks instrument现在包含了一个cycle视图,能够发现你的应用中的retain cycle,并图像显示出来。
__unsafe_unretain和__weak都能避免retain cycle,但是他们也有一些细微的不同。对于__weak,当释放指针指向的对象时,该对象的指针将转换为nil,这是比较安全的行为。而__unsafe_unretain,正如其名称隐藏的含义,尽管释放指针指向的对象时,该指针将继续指向原来的内存。这将会导致应用crash,所以是unsafe。
为什么我们仍要使用__unsafe_unretain呢?这是因为__weak直到iOS5.0以及lion之后才出现。
而__autoreleasing 的英文解释为:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用传参时使用。
最后需要注意的一点是:cocoa设定了一个规则,即父对象建立子对象的强引用,而子对象只对父对象建立弱引用。
而使用弱引用时需要注意,当你发消息给一个被dealloc的弱引用对象时,你的程序会崩毁。因此,必须细致地判断对象是否有效。多数情况下,被弱引用地对象是知道其他对象对它的弱引用的,所以当它自己dealloc时,需要通知对它弱引用的其他对象。
相关文章推荐
- iOS 高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
- iOS 高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
- iOS 高级内存管理:比较__unsafe_unretain、__strong、__weak、__autoreleasing
- ios 比较__unsafe_unretain、__strong、__weak、__autoreleasing
- iOS中 property中的属性strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
- iOS内存管理-所有权修饰符:__strong, __weak/__unsafe_unretained, __autoreleasing
- iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
- ios内存管理语义 assign strong weak copy unsafe_unretained
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
- 从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】
- iOS海哥开发笔记 (海哥原创,retain、strong、weak、assign区别)
- iOS开发中@property的属性weak nonatomic strong readonly等介绍
- IOS-48-解决开发中自定义控件在不同型号手机上不能显示的问题 (区别在于iOS修改了weak、strong属性)
- IOS内存管理retain,assign,copy,strong,weak
- iOS 内存管理(strong weak copy)详解
- iOS开发之assign retain copy strong weak 的区别
- property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解
- iOS开发中@property的属性weak nonatomic strong readonly等介绍
- IOS内存管理retain,assign,copy,strong,weak
- iOS开发中@property的属性weak nonatomic strong readonly