2011-12-12 153 views
8

我有一个BOOL属性,我想在我的类初始值设定项中设置。设置BOOL属性的正确方法

@property (assign, nonatomic) BOOL isEditMode; 

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

编译器给我一个“Incompatible integer to pointer conversion”警告。我在这里做错了什么?

回答

16

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

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

2

您只需直接分配值:我想你的意思

isEditMode = NO; 
+2

'setValue:forKey:'是NSObject的一个方法。它对任何Cocoa对象都有效。 – Chuck

+0

使用KVC设置BOOL值有什么问题? KVC仅用于物体吗? – NSExplorer

+3

如果您使用KVC进行设置,则密钥为字符串。 'isEditMode'是你班上实际的boolean ivar;你想要的是'@“isEditMode”',一个字符串命名伊娃。 –

2

self.isEditMode = NO; 

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

+0

二传手可以工作,但没有必要。 OP表示他希望在类初始化程序中设置该值,并且他没有在其财产声明中重新定义该设置程序。 – Jim

5

正确的语法设置一个属性就是

self.isEditMode = NO; 

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

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

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

这就是说,因为你在init方法的时候,我会强烈建议避免任何属性访问任何和而不是直接使用的伊娃,在

isEditMode = NO; 

这避免了重写二传手的是可能性调用(在这个类或一个子类中),它假定对象已经完成了初始化。出于同样的原因,您还希望避免-dealloc内部的财产访问。