将'__autoreleasing id *'发送到'__unsafe_unretained id *'类型的参数

时间:2012-03-03 13:26:27

标签: automatic-ref-counting autorelease

Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *' changes retain/release properties of pointer

任何人都可以帮我解决这个问题!

1 个答案:

答案 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