【问题标题】:associatedValueForKey, unrecognized keyassociatedValueForKey,无法识别的键
【发布时间】:2012-09-12 00:37:06
【问题描述】:

如果我没有使用“objc_setAssociatedObject”将对象/键关联到 NSObject,然后调用“objc_getAssociatedObject”,这样安全吗?

我已经在模拟器中对其进行了测试,它没有崩溃,但我想确定一下。

当我打电话时:

 objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN);

当我的 NSObject 被释放时,我与我的 NSObject 关联的对象是否会被释放? (我正在使用 ARC)。

【问题讨论】:

  • 鉴于 ARC 的工作方式,ARC 似乎不太可能为您插入 objc_setAssociatedObjectnilobjc_removeAssociatedObjects - 因为它不知道将这些呼叫放在哪里。但我在文档中找不到明确的答案。

标签: objective-c automatic-ref-counting nsobject objective-c-runtime


【解决方案1】:

如果没有关联,objc_getAssociatedObject 将返回nil

当您关联一个对象时,它将使用最后一个参数中提供的语义。例如,OBJC_ASSOCIATION_RETAIN 将保留对象,因此只要关联存在,它就不会被释放。

当持有关联的对象(objc_setAssociatedObject的第一个参数)dealloc时,它会破坏关联。当关联被破坏时,保留的对象将被释放(如果它一开始就被保留)。

所以,对于你的例子:

objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN);

value 将被保留,直到关联被破坏。当self deallocs 或与另一个objc_setAssociatedObject 更改关联时,关联将被破坏。

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多