我正在尝试在objc_setAssociatedObject中使用密钥,如下所示:
如何在对象中使用objc_setAssociatedObject/objc_getAssociatedObject?
我有一个定义的MyConstants.h文件
static NSString *myConstant = @"MyConstant";
Run Code Online (Sandbox Code Playgroud)
然后,此文件通过MyFramework.h包含在MyFramework中
#import ...;
#import "MyConstants.h"
#import ...;
Run Code Online (Sandbox Code Playgroud)
然后在我的项目中,框架通过.pch标头包含在所有文件中.
#import <Cocoa/Cocoa.h>
#import <MyFramework/MyFramework.h>
Run Code Online (Sandbox Code Playgroud)
这一切都按预期工作.问题是当我用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));
}
Run Code Online (Sandbox Code Playgroud)
哪些日志:
Associating with key at 0x7fff5fbfecdf
Seeking association for key at 0x7fff5fbfecef
Will find (null)
Run Code Online (Sandbox Code Playgroud)
你会注意到指针移动了.
但是,再次调用相同的方法会显示相同的指针.就像常量IS是一个常量,在导入它的文件中,但不是整个项目.
问:如何正确定义和导入包含常量的标题,以便常量实际上在内存中的常量位置?
如果有两个文件static char something,每个文件都有自己的副本 - 它们不代表同一块内存.如果您希望两个文件可以访问密钥,则必须在标头中执行此操作:
extern const char MyConstantKey;
Run Code Online (Sandbox Code Playgroud)
这在一个实现文件(.c或.m)中:
const char MyConstantKey;
Run Code Online (Sandbox Code Playgroud)
这char在内存中定义了一个单一的位置,所有文件在您使用时都会指向该位置&MyConstantKey.
| 归档时间: |
|
| 查看次数: |
1103 次 |
| 最近记录: |