将'BOOL'(又名'signed char')隐式转换为'id',objc_setAssociatedObject

时间:2013-02-17 04:58:12

标签: ios objective-c objective-c-category

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

头文件包含:

@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

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

2 个答案:

答案 0 :(得分:19)

objc_setAssociatedObject函数需要第3个参数的Objective-C对象。但是您尝试传入非对象BOOL值。

这与尝试向BOOL添加NSArray没什么区别。你需要包装BOOL

尝试:

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

当您稍后获得关联对象时,您需要从BOOL中提取NSNumber值。

更新:使用现代Objective-C,您可以:

objc_setAssociatedObject(self, animatingKey, @(value), OBJC_ASSOCIATION_RETAIN_NONATOMIC);

答案 1 :(得分:0)

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)

objc_setAssociatedObject接受id类型的值作为第三个参数,并且您尝试将BOOL传递给它。因此,根据需要进行转换。