在objc_SetAssociatedObject中使用非id指针作为值是否可以?

时间:2011-05-13 23:42:10

标签: objective-c cocoa objective-c-runtime

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

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

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

2 个答案:

答案 0 :(得分:6)

您正在以文档未明确支持的方式使用API​​。因此,在下次更新OS X / iOS时,您不能抱怨。这是谨慎的一个原因。

The documentationOBJC_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);
}