正如標題所述。如果我這樣做,立即沒有任何錯誤:可以在objc_SetAssociatedObject中使用非id指針作爲值嗎?
- (void) associateSelector:(SEL)value withPointer:(void*)key
{
objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}
有沒有什麼好理由要謹慎使用它?
正如標題所述。如果我這樣做,立即沒有任何錯誤:可以在objc_SetAssociatedObject中使用非id指針作爲值嗎?
- (void) associateSelector:(SEL)value withPointer:(void*)key
{
objc_SetAssociatedObject(self, key, (id) value, OBJC_ASSOCIATION_ASSIGN);
}
有沒有什麼好理由要謹慎使用它?
您正在以文檔未明確支持的方式使用API。因此,當OS X/iOS的下一次更新中斷時,您無法投訴。這是謹慎的原因之一。
The documentation說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);
}