只是想确保我做对了:
- 我需要
__unsafe_unretain
件我不拥有的东西吗? - 如果对象是
__unsafe_unretained
,我需要使用@property
中的assign
吗?这是否意味着对象不会保留,而只是引用我分配给的对象? - 除了代表,我想什么时候使用它?
- 那是ARC的东西还是以前用过?
只是想确保我做对了:
__unsafe_unretain
件我不拥有的东西吗?__unsafe_unretained
,我需要使用@property
中的assign
吗?这是否意味着对象不会保留,而只是引用我分配给的对象?LLVM Compiler3.0引入了四个新的所有权限定符:__strong
、__autoreleasing
、__unsafe_unretained
和__weak
.前三个甚至在ARC之外也是可用的,根据the specification.
正如Joshua指出的那样,默认情况下,所有指针在ARC下都隐含为__strong
.这意味着,当对象被分配给该指针时,只要该指针引用它,该对象就会一直保留.这对大多数情况都很好,但它为保留周期打开了可能性,正如我在答案here中所描述的那样.例如,如果有一个对象包含另一个对象作为实例变量,但第二个对象与作为其委托的第一个对象有强链接,则这两个对象永远不会被释放.
正是由于这个原因,才有了__unsafe_unretained
和__weak
限定符.它们最常见的用途是用于委托,您可以使用weak
或unsafe_unretained
属性为该委托定义一个属性(assign
实际上是unsafe_unretained
),然后通过将相应的实例变量标记为__weak
或__unsafe_unretained
来匹配该属性.这意味着委托实例变量仍将指向第一个对象,但不会导致保留该对象,从而打破保留循环并允许释放这两个对象.
除了委托之外,这对于打破代码中可能形成的任何其他保留循环都很有用.有用的是,Leaks工具现在包括一个Cycle视图,该视图以图形方式显示它在应用程序中发现的保留周期.
__unsafe_unretained
和__weak
都可以防止对象保留,但方式略有不同.对于__weak
,指向对象的指针在其指向的对象释放时将转换为nil
,这是非常安全的行为.顾名思义,__unsafe_unretained
将继续指向对象所在的内存,即使在它被释放之后也是如此.这可能会由于访问该释放的对象而导致崩溃.
那你为什么要用__unsafe_unretained
呢?遗憾的是,只有iOS 5.0和Lion才支持__weak
作为部署目标.如果你想要回到iOS 4.0和雪豹,你必须使用__unsafe_unretained
限定符,或者使用像Mike Ash的MAZeroingWeakRef这样的东西.