我有疑问。这对我来说并不明显。
假设我们在一个类中有一个名为myProperty 的@property。我们在合成的时候可以做两件事。我们可以为它分配一个 ivar,比如 _someIVar,或者我们可以简单地省略它,在这种情况下,编译器会负责创建一个 ivar 与该属性具有相同的名称 myProperty。在第一种情况下,我们可以使用 ivar _someIVar 访问该属性。在第二种情况下,我们可以使用编译器为我们创建的 ivar myProperty。
现在我的疑问是,当我们从已经在导航堆栈中的 View Controller 中推送另一个 View Controller 时,我们使用,
[self.navigationController pushViewController:newViewController animated:YES];
因为 navigationController 是一个属性,我假设它应该有一个 ivar 分配给它。只有两种可能。
1) 第一个是 Apple 的惯例是在命名 ivar 之前加上 下划线 (_)。如果是这种情况,我可以像这样调用 pushViewController:animated: 方法,
[_navigationController pushViewController:newViewController animated:YES];
2) 显然,第二种可能性是没有下划线的ivar,
[navigationController pushViewController:newViewController animated:YES];
但是编译器不允许我以任何一种方式访问 navigationController。为什么?这与私有(private)属性或其他东西有关,还是我根本不了解 Objective-C?
最佳答案
你不知道 Apple 做了什么来实现 navigationController 属性,所以你不能假设有一个 _navigationController ivar float 在 UIViewController 类的某个地方。恰当的例子:属性可以声明为@dynamic,在这种情况下,实现可以是任何东西。
无法仅通过查看属性本身来猜测支持属性的 ivar。
关于iphone - Objective-C 命名约定——澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9817203/