正确设置BOOL属性的方法

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

@property (assign, nonatomic) BOOL isEditMode; - (id)init { . . . [self setValue:NO forKey:isEditMode]; return self; } 

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

键值编码方法setValue:forKey:仅接受对象作为参数。 要设置BOOL,需要使用[NSNumber numberWithBool:NO]将数字包装在值对象中。 但没有理由这样做。 键值编码是实现这一目标的迂回方式。 要么self.isEditMode = NO要么只是isEditMode = NO 。 后者在init方法中是优选的(因为setter可以运行在完全设置对象之前可能不需要的任意代码)。

但是要详细说明第一点:Key-Value Coding以这种方式工作的原因是因为类型系统不能表示有时是对象的参数,而在其他时候则表示原始值。 因此,KVC始终处理对象,并根据需要自动处理原始值。 类似地,如果您执行[yourObject valueForKey:@"isEditMode"] ,您将获得包装实际值的NSNumber对象。

设置属性的正确语法就是

 self.isEditMode = NO; 

如果你想使用-setValue:forKey:你必须把它写成

 [self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"]; 

但是,在您的情况下,绝对没有理由这样做。

也就是说,因为你是一个init方法,我强烈建议避免任何属性访问,而是直接使用ivar,如

 isEditMode = NO; 

这避免了被覆盖的setter被调用的可能性(在这个类或子类中),它假设对象已经完成了初始化。 出于同样的原因,您还希望避免在-dealloc属性访问。

您可以直接分配值:

 isEditMode = NO; 

我想你的意思是:

 self.isEditMode = NO; 

如果您的代码确实编译(我对Objective-C很新,所以我不知道) setValue可能需要一个指向字符串的指针(例如@"isEditMode" )而不是其他类型的isEditMode (例如isEditMode )。