Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer
任何人都可以帮我解决这个问题!
答案 0 :(得分:5)
我自己刚刚开始使用ARC,但我遇到了同样的错误,所以也许我可以尝试帮助解决这个问题。
当您想要支持iOS 4+时,使用 __unsafe_unretained
。对于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 ivars,您应该使用__strong
。