ARC - __unsafe_unretained的含义?

sha*_*oga 76 macos objective-c ios xcode4 automatic-ref-counting

只是想确保我做对了:

  1. 我需要__unsafe_unretain我不拥有的物品吗?
  2. 如果一个对象是__unsafe_unretained我需要assign@property?这是否意味着不保留对象,只是引用我指定的对象?
  3. 除了代表,我什么时候才能使用它?
  4. 这是ARC的事情还是之前使用过的?

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.

  • @jlehr - `NSString*myStrings = {@"Foo",@"Bar"};`是无效的Objective-C语法; `@"Foo"`本身就输入了`NSString*`.也许你的意思是`NSString*myStrings [] = {@"Foo",@"Bar"};`,但在这种情况下,我真的不明白`__unsafe_unretained`将如何特别有用. (4认同)
  • 当然`__unsafe_unretained`可用于定义`NSString`常量等的C数组,例如`NSString __unsafe_unretained*myStrings = {@"Foo",@"Bar",@"Baz",nil}; (2认同)
  • @shannoga - 不,您必须手动指定 `__weak` 作为限定符才能使用这些指针。您仍然可以将 `__unsafe_unretained` 与纯 5.0 目标一起使用,它的行为不会像 `__weak`。如果您想要根据您的目标是否支持在两种模式之间切换的东西,您可以使用特定于编译器的定义,就像我在这里建议的那样:http://stackoverflow.com/a/8594878/19679 (2认同)
  • @Quuxplusone两项都是正确的 - 我正在将C数组与结构混合在一起.我应该说的是`__unsafe_unretained`可以是有用的C结构成员,它指向NSString常量,例如`struct foo {__unsafe_unretained NSString*const s; int x; };` (2认同)

归档时间:

查看次数:

39624 次

最近记录:

12 年,7 月 前