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
限定符.它们最常见的用途是代理,您可以使用weak
or 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 次 |
最近记录: |