我有一个BOOL属性,我想在我的类初始化程序中设置。
@property (assign, nonatomic) BOOL isEditMode;
- (id)init
{
. . .
[self setValue:NO forKey:isEditMode];
return self;
}
编译器给出了“与指针转换不兼容的整数”警告。我在这做错了什么?
答案 0 :(得分:16)
键值编码方法setValue:forKey:
仅接受对象作为参数。要设置BOOL,您需要使用[NSNumber numberWithBool:NO]
将数字包装在值对象中。但没有理由这样做。键值编码是实现这一目标的迂回方式。要么self.isEditMode = NO
,要么isEditMode = NO
。后者在init方法中是首选(因为setter可以运行在完全设置对象之前可能不需要的任意代码)。
但是要详细说明第一点:Key-Value Coding以这种方式工作的原因是因为类型系统不能表示有时是对象的参数,有时也不能表示原始值。因此,KVC始终处理对象,并根据需要自动处理原始值。同样,如果你执行[yourObject valueForKey:@"isEditMode"]
,你将获得一个包含实际值的NSNumber对象。
答案 1 :(得分:5)
设置属性的正确语法只是
self.isEditMode = NO;
如果您想使用-setValue:forKey:
,则必须将其写为
[self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"];
但是,在你的情况下绝对没有理由这样做。
那就是说,因为你使用init
方法,我强烈建议避免任何属性访问,而是直接使用ivar,如
isEditMode = NO;
这避免了被覆盖的setter被调用的可能性(在这个类或子类中),假设该对象已经完成了初始化。出于同样的原因,您还希望避免-dealloc
内的属性访问。
答案 2 :(得分:2)
您可以直接指定值:
isEditMode = NO;
答案 3 :(得分:2)
我认为你的意思是:
self.isEditMode = NO;
如果你的代码确实编译了(我对Objective-C很新,所以我不知道)setValue
可能需要指向一个字符串(@"isEditMode"
,例如),而不是一些其他类型(isEditMode
,例如)。