sha*_*oga 76 macos objective-c ios xcode4 automatic-ref-counting
只是想确保我做对了:
__unsafe_unretain我不拥有的物品吗?__unsafe_unretained我需要assign在@property?这是否意味着不保留对象,只是引用我指定的对象?Bra*_*son 188
该LLVM编译器3.0中引入了四个新的所有权预选赛:__strong,__autoreleasing,__unsafe_unretained,和__weak.根据规范,前三个甚至可以在ARC之外使用.
正如Joshua指出的那样,默认情况下所有指针都隐含__strong在ARC下.这意味着当一个对象被分配给该指针时,只要该指针引用它,它就会被保留.这对于大多数事情都很好,但它为保留周期开辟了可能性,正如我在这里的回答中所描述的那样.例如,如果您有一个包含另一个对象作为实例变量的对象,但该第二个对象具有一个强大的链接作为其委托的第一个对象,那么这两个对象将永远不会被释放.
出于这个原因,存在__unsafe_unretained和__weak限定符.它们最常见的用途是代理,您可以使用weakor unsafe_unretained属性(assign有效地unsafe_unretained)为该委托定义属性,然后通过用__weak或标记相应的实例变量来匹配该属性__unsafe_unretained.这意味着委托实例变量仍将指向第一个对象,但它不会导致保留该对象,从而打破了保留周期并允许释放两个对象.
除了代理之外,这对于破坏代码中可能形成的任何其他保留周期非常有用.有用的是,Leaks仪器现在包含一个Cycles视图,它以图形方式显示它在应用程序中发现的保留周期.
无论__unsafe_unretained和__weak防止物体的保留,但稍有不同的方式.因为__weak,指向对象的指针将转换为nil它指向的对象的解除分配,这是非常安全的行为.顾名思义,__unsafe_unretained即使在对象被释放后,它仍将继续指向对象所在的内存.由于访问了已释放的对象,这可能导致崩溃.
你为什么要用__unsafe_unretained呢?不幸的是,__weak仅支持iOS 5.0和Lion作为部署目标.如果你想回到iOS 4.0和Snow Leopard,你必须使用__unsafe_unretained限定符,或使用Mike Ash的MAZeroingWeakRef.
| 归档时间: |
|
| 查看次数: |
39624 次 |
| 最近记录: |