【发布时间】:2012-03-03 13:26:27
【问题描述】:
Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer
谁能帮我解决这个问题!
【问题讨论】:
标签: automatic-ref-counting autorelease
Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer
谁能帮我解决这个问题!
【问题讨论】:
标签: automatic-ref-counting autorelease
我自己刚刚开始熟悉 ARC,但我遇到了同样的错误,所以也许我可以尝试帮助解决这个问题。
__unsafe_unretained 用于支持 iOS 4+。对于 iOS 5.0+,应使用 __weak。不同之处在于__weak 指针被归零。意思是,当没有其他对象引用该对象并且它被释放时,__weak 指针将设置为 nil。因此,如果您确实引用它,您将不会遇到 EXC_BAD_ACCESS 崩溃。
与其他任何内容(例如对象类型和限定符)一样,对于 ARC 中的 Objective-C 对象,您现在必须指定生命周期。这样 ARC 就知道如何合成保留/释放调用。
如果您不指定任何内容,则默认值为__strong。
这些生命周期说明符必须匹配。
在您的情况下,您将一个指针 __unsafe_unretained 分配给另一个指针 __strong。
要解决此问题,请将接收指针也更改为__unsafe_unretained。这可能意味着将生命周期说明符添加到方法签名中。例如:
- (void)myMethod:(__unsafe_unretained NSString *)aString
{
}
不要忘记__unsafe_unretained 就像它的名字所描述的那样。它不安全,也没有保留!因此,您最好将该对象安全地保留在其他地方,而不是在它发布后以这样的方法引用它。您只需将其用于委托中的弱引用,例如父/子关系。对于其他所有内容,特别是普通的 Objective-C 变量,您应该使用 __strong。
【讨论】: