'BOOL'(又名'signed char')到'id'的隐式转换,objc_setAssociatedObject

我正在使用关联的引用作为我的类别的属性的存储

头文件包含:

@interface UIImageView (Spinning) @property (nonatomic, assign) BOOL animating; @end 

执行是

 - (void)setAnimating:(BOOL)value { objc_setAssociatedObject(self, animatingKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } 

但是,我得到了上面的行警告

 Implicit conversion of 'BOOL' (aka 'signed char') to 'id' is disallowed with ARC 

如果你知道我在这里做错了什么,请帮助如何避免这个问题

objc_setAssociatedObject函数需要第三个参数的Objective-C对象。 但是你正试图传递一个非对象的BOOL值。

这与尝试将一个BOOL添加到一个NSArray没有什么不同。 你需要包装BOOL

尝试:

 objc_setAssociatedObject(self, animatingKey, [NSNumber numberWithBool:value], OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

当然,当你稍后获得关联的对象时,你将需要从NSNumber提取BOOL值。

更新:使用现代的Objective-C,你可以做到:

 objc_setAssociatedObject(self, animatingKey, @(value), OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
 void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy) 

objc_setAssociatedObject接受值的idtypes作为第三个参数,并且您正试图将BOOL传递给它。 所以根据需要进行转换。