【发布时间】:2011-02-16 10:01:31
【问题描述】:
阅读question on @private 后,我明白它是如何工作的。但是,由于所有变量都默认为@protected,并且如果不定义访问器就无法真正访问变量,@public 究竟做了什么?什么时候用?
【问题讨论】:
标签: iphone objective-c
阅读question on @private 后,我明白它是如何工作的。但是,由于所有变量都默认为@protected,并且如果不定义访问器就无法真正访问变量,@public 究竟做了什么?什么时候用?
【问题讨论】:
标签: iphone objective-c
@public 表示 ivar 可以在任何地方访问。
@private 表示类的实例可以访问 ivar
@protected 表示类和子类的实例可以访问 ivar。
要访问类外部的公共 ivar,请使用标准 C 结构指针运算符 -> 例如
foo->instanceVarible = xyzzy;
你什么时候使用它?就我而言:从来没有。我总是将实例变量定义为@private(IBOutlets 除外)并使用访问器在类外访问它们。
【讨论】:
你什么时候使用它?当你需要它是public。要从该类外部访问它(没有任何额外的访问器),就是这样。 :)
【讨论】:
@public 是可见性修饰符。这意味着声明为@public 的实例变量可以被任何类的实例访问。公共成员可以被子类或其他类访问。相反,私有成员不能被子类或其他类访问。
【讨论】:
这个问题是关于编码实践的。
如果您正在编写非常严格的代码,您将始终使用@private 作为实例变量,以确保只有类函数可以访问它们。在我看来,这仅在非常特定的情况下是必需的,例如,类变量(一个类的多个实例有一个变量)。
大多数时候@protected 最适合普通实例变量,因为它允许子类直接访问它们。它更自然,并且与扩展类的想法一致。根据您实际访问它们的方式,Objective C 可能实际上使用该类的 setter 和 getter 函数。 @protected 是高效代码和使代码更具可读性的理想选择。
@public 保留用于快速或脏编程。直接访问实例成员可能会更快,或者您正在与另一种编程语言/库交互并且您正在编写一些胶水。我尽量避免它,因为这意味着代码维护更加困难。
显然,您可以一直使用 @public - 回到 C 编程的美好时光。
您当然可以选择不为类变量定义任何访问器,因为它是类内部的,或者因为您声明为 @public,但由于 Objective C 使得使用 @property 和 @synthesize 对它们进行原型制作变得容易似乎没有多大意义。内部类变量不需要 setter/getter,因为任何类方法都可以直接访问它们。
【讨论】: