正确设置BOOL属性的方法

时间:2011-12-12 23:32:07

标签: objective-c ios

我有一个BOOL属性,我想在我的类初始化程序中设置。

@property (assign, nonatomic) BOOL isEditMode; 

- (id)init
{
    . . . 
    [self setValue:NO forKey:isEditMode];
    return self;
}

编译器给出了“与指针转换不兼容的整数”警告。我在这做错了什么?

4 个答案:

答案 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,例如)。