【问题标题】:Sending '__autoreleasing id *' to parameter of type '__unsafe_unretained id *'将“__autoreleasing id *”发送到“__unsafe_unretained id *”类型的参数
【发布时间】: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


    【解决方案1】:

    我自己刚刚开始熟悉 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多