加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – objc_setAssociatedObject的密钥不断更改地址

发布时间:2020-12-16 03:36:46 所属栏目:百科 来源:网络整理
导读:我正在尝试在objc_setAssociatedObject中使用密钥,如下所示: How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object? 我有一个定义的MyConstants.h文件 static NSString *myConstant = @"MyConstant"; 然后,此文件通过MyFramew
我正在尝试在objc_setAssociatedObject中使用密钥,如下所示:

How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?

我有一个定义的MyConstants.h文件

static NSString *myConstant = @"MyConstant";

然后,此文件通过MyFramework.h包含在MyFramework中

#import ...;
#import "MyConstants.h"
#import ...;

然后在我的项目中,框架通过.pch标头包含在所有文件中.

#import <Cocoa/Cocoa.h>
#import <MyFramework/MyFramework.h>

这一切都按预期工作.问题是当我用myConstant作为键调用objc_setAssociatedObject或objc_getAssociatedObject时,它不起作用.原因很明显,从日志中可以看出:

- (void)doSomething:(id)key { //Gets called with myConstant
    NSLog(@"Associating with key at %p",&key);
    objc_setAssociatedObject(self,&key,object,policy);
}
- (void)doSomethingElse:(id)key { //Gets called with myConstant
    NSLog(@"Seeking association for key at %p",&key);
    NSLog(@"Will find %@",objc_getAssociatedObject(self,&key));
}

哪些日志:

Associating with key at 0x7fff5fbfecdf
Seeking association for key at 0x7fff5fbfecef
Will find (null)

你会注意到指针移动了.

但是,再次调用相同的方法会显示相同的指针.就像常量IS是一个常量,在导入它的文件中,但不是整个项目.

问:如何正确定义和导入包含常量的标题,以便常量实际上在内存中的常量位置?

解决方法

如果两个文件有静态char,则每个文件都有自己的副本 – 它们不代表同一块内存.如果您希望两个文件可以访问密钥,则必须在标头中执行此操作:
extern const char MyConstantKey;

这在一个实现文件(.c或.m)中:

const char MyConstantKey;

这在内存中定义了一个单字符宽的位置,当您使用& MyConstantKey时,所有文件都将指向该位置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读