目标 c - 是否可以在objc_SetAssociatedObject中使用非 id 指针作为值



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

- (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);
}

相关内容

最新更新