3

正如标题所说。如果我这样做,不会立即出错:

- (void) associateSelector:(SEL)value withPointer:(void*)key
{
    objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}

是否有充分的理由谨慎使用它?

4

2 回答 2

6

您以文档未明确支持的方式使用 API。因此,当它在 OS X / iOS 的下一次更新中中断时,你不能抱怨。这是需要谨慎的原因之一。

文档说这OBJC_ASSOCIATION_ASIGN设置了一个弱引用。这在垃圾收集的情况下意味着一件不平凡的事情,所以要小心。

如果有办法以官方支持的方式做事,我会更喜欢它。在您的情况下, usingNSStringFromSelector将立即使您的代码受支持。

于 2011-05-13T23:52:33.137 回答
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);
}
于 2011-05-13T23:58:53.307 回答