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