正确设置BOOL属性的方法

NSE*_*rer 9 objective-c ios

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

@property (assign, nonatomic) BOOL isEditMode; 

- (id)init
{
    . . . 
    [self setValue:NO forKey:isEditMode];
    return self;
}
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*uck 16

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

但是要详细说明第一点:键值编码以这种方式工作的原因是因为类型系统不能表示有时是对象的参数,而在其他时候表示原始值.因此,KVC始终处理对象,并根据需要自动处理原始值.同样,如果你这样做[yourObject valueForKey:@"isEditMode"],你将获得一个包装真实值的NSNumber对象.


Lil*_*ard 5

设置属性的正确语法就是

self.isEditMode = NO;
Run Code Online (Sandbox Code Playgroud)

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

[self setValue:[NSNumber numberWithBOOL:NO] forKey:@"isEditMode"];
Run Code Online (Sandbox Code Playgroud)

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

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

isEditMode = NO;
Run Code Online (Sandbox Code Playgroud)

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