正如标题所说。如果我这样做,不会立即出错:
- (void) associateSelector:(SEL)value withPointer:(void*)key
{
objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}
有什么充分的理由对使用它持谨慎态度吗?
您正在使用文档未明确支持的方式使用 API。因此,当它在OS X/iOS的下一次更新中中断时,您不能抱怨。这是需要谨慎的一个原因。
文档说OBJC_ASSOCIATION_ASIGN
设置了一个弱引用。这意味着在垃圾收集的情况下是一件不平凡的事情,所以要小心。
如果有一种方法可以以官方支持的方式做事,我更喜欢它。在您的情况下,使用 NSStringFromSelector
会立即使您的代码受支持。
这是一个坏主意。正如 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);
}