正确设置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
)。