为什么变量和方法在objective-c中作为字符串传递?

时间:2014-04-16 00:05:22

标签: objective-c kvc

作为一名具有C ++基本经验的iOS开发人员,我正在比较这些语言的许多功能。我想知道为什么这个示例代码段中的变量名称为:

[bankInstance addObserver:personInstance
              forKeyPath:@"accountBalance"
              options:NSKeyValueObservingOptionNew
              context:NULL];

作为@"字符串"传递,而不是通过指针传递?

3 个答案:

答案 0 :(得分:2)

您注意到的不一定是变量名称。相反,它是一个属性(并且备份它的变量名可能是相同的名称,也可能是不同的,具体取决于属性的@synthesize。)

这允许不相关的类在定义的情况下访问另一个类的属性,例如只读,而不需要暴露类的其他部分。

答案 1 :(得分:2)

这是一条关键路径。它不一定是变量名;相反,它是一个属性列表。在这种情况下,列表只有一个项目,但在其他情况下,它可能类似于@"account.balance.inDollars",其中链中的每个元素都按名称查找其属性。

至于为什么你不写,比如说account.balance.inDollars - 好吧,想想如果你在那里替换它会怎么做。在设置观察者并传递属性的当前值时,它将访问该属性。那不是我们想要的。相反,我们想告诉观察机制如何查找属性本身,以便它可以监视更改,并使用key-value coding执行此操作。 (这也允许您在Interface Builder中以图形方式设置绑定。)

答案 2 :(得分:0)

在Swift中,您可以使用#keyPath()生成密钥路径字符串。

let keyPathString = #keyPath(BankAccount.accountBalance)

在编译时,()内的标记将被检查为有效的密钥路径。

这比编写自己的密钥路径字符串文字要好得多,因为编译器会提醒您输入错别字或重构引起的错误。