正如标题所说。如果我这样做,立刻就不会出错:
- (void) associateSelector:(SEL)value withPointer:(void*)key
{
objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}
是否有充分理由谨慎使用它?
答案 0 :(得分:6)
您正在以文档未明确支持的方式使用API。因此,在下次更新OS X / iOS时,您不能抱怨。这是谨慎的一个原因。
The documentation说OBJC_ASSOCIATION_ASIGN
设置了弱引用。这意味着垃圾收集情况下的重要事情,所以要小心。
如果有办法以官方支持的方式做事,我宁愿这样做。在您的情况下,使用NSStringFromSelector
会立即支持您的代码。
答案 1 :(得分:3)
这是一个坏主意。正如Yuji所说,您违反了文档中定义的API。如果您确实要存储任意值,请将其换行NSValue
并将其存储为OBJC_ASSOCIATION_RETAIN_NONATOMIC
。
- (void) associateSelector:(SEL)value withPointer:(void*)key {
NSValue *nsvalue = [NSValue valueWithBytes:&value objcType:@encode(SEL)];
objc_SetAssociatedObject(self, key, nsvalue, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}