我一直在使用 objc_setAssociatedObject() 这种方式:
objc_setAssociatedObject(myObject, @"myKey1", obj2, OBJC_ASSOCIATION_ASSIGN);
特别是,我的键是一个字符串,因此编译器使用指向该字符串的指针。我在 objc_getAssociatedObject() 中指定了相同的字符串:
objc_getAssociatedObject(myObject, @"myKey1").
我已经使用这个方案很长时间了,没有任何问题。但是,SO 上的示例使用指向静态变量的指针,所以我现在意识到我的方法可能不正确。编译器每次都使用相同的指针,所以它总是有效的。
我的方法可以吗?这似乎等同于使用指向静态字符串的指针。在什么情况下编译器会存储我的 key 的两个不同副本?
最佳答案
实际上,如果两个相等的字符串常量在同一个翻译单元中使用,则它们具有相同的地址。 (TU 是来自 C 的一个术语,基本上它的意思是:“相同的 .m 文件”。)但是这种行为并没有保证,将来可能会改变。
http://clang.llvm.org/docs/ObjectiveCLiterals.html
顺便说一句:您应该使用无碰撞键。 MyKey
不满足这一点。最好使用 com.MyComponay.MyTarget.MyKey
或等效的 rDNS 表示法。