gpt4 book ai didi

ios - objc_setAssociatedObject() 的正确键格式

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:00:46 29 4
gpt4 key购买 nike

我一直这样使用 objc_setAssociatedObject():

objc_setAssociatedObject(myObject, @"myKey1", obj2, OBJC_ASSOCIATION_ASSIGN);

特别是,我的 key 是一个字符串,因此编译器使用指向该字符串的指针。我在 objc_getAssociatedObject() 中指定了相同的字符串:

objc_getAssociatedObject(myObject, @"myKey1").

我一直在使用这个方案很长时间没有任何问题。但是,SO 上的示例使用了指向静态变量的指针,所以我现在意识到我的方法可能不正确。编译器每次都使用相同的指针,因此它始终有效。

我的方法可以吗?这似乎等同于使用指向静态字符串的指针。在什么情况下,编译器可能会存储我的 key 的两个不同副本?

最佳答案

实际上,如果两个相等的字符串常量在同一个翻译单元中使用,则它们具有相同的地址。 (TU 是 C 的一个术语,基本上它的意思是:“相同的 .m 文件”。)但是这种行为并不能保证并且将来可能会改变。

This caveat applies to compile-time string literals as well. Historically, string literals (using the @"..." syntax) have been uniqued across translation units during linking. This is an implementation detail of the compiler and should not be relied upon. If you are using such code, please use global string constants instead (NSString * const MyConst = @"...") or use isEqual:.

http://clang.llvm.org/docs/ObjectiveCLiterals.html

顺便说一句:您应该使用无碰撞键。 MyKey 不满足这个要求。最好使用 com.MyComponay.MyTarget.MyKey 或等效的 rDNS 表示法。

关于ios - objc_setAssociatedObject() 的正确键格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29487330/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com