跳到主要内容

若类有实例变量NSString *_foo,调用setValue:forKey:时,可以以foo还是_foo作为key?

参考答案:

在 Objective-C 中,使用 setValue:forKey: 方法进行 KVC (Key-Value Coding) 操作时,key 的命名通常遵循驼峰命名法(camelCase),而不是带有下划线的变量名。因此,对于实例变量 NSString *_foo,你应该使用 foo 作为 key,而不是 _foo

例如:

[yourObject setValue:@"someValue" forKey:@"foo"];

这里,yourObject 是你的类的实例,@"someValue" 是你想要设置的值,而 @"foo" 是对应的 key。

需要注意的是,虽然 Objective-C 的实例变量名可能以下划线开头作为一种命名约定(通常用于表示私有变量),但在使用 KVC 时,这种下划线前缀在 key 中通常会被省略。KVC 主要是用于访问和修改对象的属性,而不是直接操作其内部变量。因此,key 应该与属性的名称相匹配,而不是与实例变量的名称完全对应。

此外,如果你的类有一个名为 foo 的属性(由 @property 声明),那么 setValue:forKey: 会自动调用该属性的 setter 方法(如果存在的话)。如果没有显式的 setter 方法,KVC 机制会尝试直接访问和修改对应的实例变量(如果它是公开的并且可访问的)。然而,这种直接访问实例变量的做法通常不是推荐的做法,因为它破坏了封装性并可能导致未定义的行为。更好的做法是使用属性,并通过属性的 setter 和 getter 方法来控制对内部状态的访问和修改。