只是想确保我做对了:
- 我需要吗
__unsafe_unretain
不属于我的物品?
- 如果一个物体是
__unsafe_unretained
我需要使用吗assign
in the @property
?这是否意味着该对象没有被保留,而只是引用我分配给的对象?
- 除了代表之外我什么时候想使用它?
- 这是 ARC 的东西还是以前用过?
LLVM 编译器 3.0 引入了四个新的所有权限定符:__strong
, __autoreleasing
, __unsafe_unretained
, and __weak
。前三个甚至在 ARC 之外也可用,根据规格 http://clang.llvm.org/docs/AutomaticReferenceCounting.html.
正如 Joshua 所指出的,默认情况下所有指针都被暗示为__strong
在 ARC 下。这意味着当一个对象被分配给该指针时,只要该指针引用它,它就会被保留。这对于大多数事情来说都很好,但它开启了保留周期的可能性,正如我在回答中所描述的那样here https://stackoverflow.com/a/6388601/19679。例如,如果您有一个对象包含另一个对象作为实例变量,但第二个对象作为其委托具有返回到第一个对象的强链接,则这两个对象将永远不会被释放。
正是由于这个原因,__unsafe_unretained
and __weak
存在限定符。它们最常见的用途是用于委托,您可以使用以下命令为该委托定义一个属性:weak
or unsafe_unretained
属性 (assign
是有效地unsafe_unretained
),然后通过标记相应的实例变量来匹配它__weak
or __unsafe_unretained
。这意味着委托实例变量仍将指向第一个对象,但不会导致该对象被保留,从而打破保留周期并允许释放两个对象。
除了委托之外,这对于打破代码中可能形成的任何其他保留周期很有用。有用的是,Leaks 工具现在包含一个 Cycles 视图,它以图形方式显示它在应用程序中发现的保留周期。
Both __unsafe_unretained
and __weak
防止物体滞留,但方式略有不同。为了__weak
,指向对象的指针将转换为nil
释放它所指向的对象,这是非常安全的行为。顾名思义,__unsafe_unretained
即使在对象被释放之后,也会继续指向对象所在的内存。这可能会因访问该已释放的对象而导致崩溃。
你为什么会使用__unsafe_unretained
然后?很遗憾,__weak
仅支持 iOS 5.0 和 Lion 作为部署目标。如果你想回到 iOS 4.0 和 Snow Leopard,你必须使用__unsafe_unretained
限定符,或者使用类似 Mike Ash 的东西MAZeroing弱引用 http://www.mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)