- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试制作一个用于 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/
如果这不是一个错误,那就是另一个错误。如果不是那样的话,那就是别的东西了。我觉得我的项目已经改变了很多,现在只是试图解决代码签名问题,结果一切都搞砸了。我严格按照说明进行操作,但出现错误,例如当前的“
我不确定是否有一些我不知道的内置变量或规则,或者 make 是否有问题,或者我只是疯了。 对于我的一个项目,我有一个如下的 makefile: CC=g++ CFLAGS=-O3 `libpng-co
我有大约 10 个 div,它们必须不断翻转,每个 div 延迟 3 秒 这个 codrops 链接的最后一个效果是我正在寻找的,但无需单击 div http://tympanus.net/Devel
我如何使用 jQuery 持续运行 PHP 脚本并每秒获取响应,以及将鼠标上的少量数据发送到同一脚本? 我真的必须添加一些随机扩展才能让这么简单的计时器工作吗? 最佳答案 To iterate is
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
使用 PHPStorm,我试图忽略每次尝试进行 git 提交时 pop 的 workspace.xml。 我的 .gitignore 看起来像: /.idea/ .idea/workspace.xml
我是一名优秀的程序员,十分优秀!