我正在关注this tutorial以了解KVC。 在该教程中说明了以下
[someObject.someProperty setText:@"This is a text"];
Using KVC:
[self setValue:@"this is a text"
forKeyPath:@"someObject.someProperty.text"]
我的问题是:
1-当我们使用KVC时,为什么我们在forKeyPath中使用“.text”?
2-does“forKeyPath”应该始终引用我们拥有的对象,或者它可以只是任何文本
答案 0 :(得分:1)
教程中的代码行:
[someObject.someProperty setText:@"This is a text"];
使用两种不同的方式来访问两个不同的属性,因此它有点令人困惑。
声明一个属性,比如说windowHeight
,声明了两个叫做 getter 的方法,它们获取属性值,以及 setter ,它设置了它。在我们的示例propertyName
和setPropertyName
中,这些方法分别命名为windowHeight
和setWindowHeight
。调用这些方法是使用属性的原始方式。以这种方式编写的教程是:
[[someObject someProperty] setText:@"This is a text"];
这会调用someProperty
的getter someObject
,它会返回另一个对象,比如someOtherObject
,然后调用setText
的setter someOtherObject
。
后来在Objective-C的开发中,点符号被引入作为getter和setter的简写。使用此表示法,getter call [someObject someProperty]
可以写为someObject.someProperty
,而setter call [someObject setSomeProperty:someValue]
可以写为赋值语句someObject.someProperty = someValue
。
在任何上述点表达式中,someObject
是一个返回对象引用的表达式。它可能是一个简单的变量引用;或者它可能是一个更复杂的表达式,包括另一个点表达式,它返回一个对象引用。
使用点表示法编写教程:
someObject.someProperty.text = @"This is a text";
与KVC 密钥路径的相似之处现在应该是显而易见的。
您的教程选择在同一声明中混合'''匹配原始和点符号样式,可能会导致您的混淆和问题。
HTH