3

人们为什么使用

@interface ViewController : UIViewController 
{
@private
    UIButton* button_;
}

公共标头中的@private 声明?在实现中声明变量会产生相同的结果,不是吗?我觉得很奇怪,我认为公共标头应该只包含真正的公共成员。如何处理受保护的成员?

@implementation ViewController
    UIButton* button_;
@end

我知道的唯一区别是这个变量只在当前编译单元内可见(.m 文件,对吗?)

方法也一样吗?我可以通过正确的方法排序或前向声明编译得很好。为什么人们关心为私有方法声明类别?仅用于测试目的?

4

4 回答 4

7

块内的变量声明@implementation将创建一个全局变量,而不是实例变量。实例变量需要定义为@interface.

虽然您可以通过类别或扩展来创建附加@interface块,但它只能包含方法声明,而不能包含实例变量。

于 2009-10-16T13:42:39.740 回答
4

我会说,虽然将私有实例变量放在所谓的公共标头中可能会让您“感觉”不对,但我不会担心。

查看 Cocoa 类的几乎所有头文件(集群类除外),您会看到 Apple 在其公共头文件中声明了它们的实例变量。

由于Apple对此表示满意,因此我认为您不必担心太多。=)

仅供参考:默认情况下,所有实例变量都受到保护。

于 2009-10-16T15:19:25.083 回答
3

方法也一样吗?

不,方法对程序的任何部分都是可见的。如果您知道选择器,则可以调用它。

我可以通过正确的方法排序或前向声明编译得很好。为什么人们关心为私有方法声明类别?仅用于测试目的?

私有类别是前向声明的一种形式。您可以将它们视为 C 原型。

安德鲁

于 2009-10-16T21:13:15.633 回答
0

@private 仅指 iVar。

默认情况下,您可以像这样访问实例的 ivars:-id iShouldNotDoThis = foo->bar;

@private 意味着您不能像那样访问 ivar,而必须使用访问方法。

id thisIsBetter = [foo bar];

与私有类别或方法无关。

于 2009-10-16T13:35:43.763 回答