gpt4 book ai didi

objective-c - objc_setAssociatedObject 的键不断改变地址

转载 作者:太空狗 更新时间:2023-10-30 03:42:04 25 4
gpt4 key购买 nike

我正在尝试制作一个用于 objc_setAssociatedObject 的 key ,如这个问题所示:

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 header 包含在所有文件中。

#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)

您会注意到指针发生了变化。

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

问:如何正确定义和导入带有常量的 header ,以便常量实际上位于内存中的固定位置?

最佳答案

如果两个文件都有static char something,每个文件都有自己的副本——它们不代表同一 block 内存。如果您希望两个文件都可以访问 key ,则必须改为在 header 中执行此操作:

extern const char MyConstantKey;

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

const char MyConstantKey;

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

关于objective-c - objc_setAssociatedObject 的键不断改变地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6847906/

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