@interface中的实例变量;标题与实现

时间:2013-09-04 14:34:44

标签: objective-c header-files instance-variables

在标题中声明私有实例变量与在实现中声明它之间有什么区别吗?

TestObj.h中的

@interface TestObj : NSObject
{
    int test;
}
@end

vs TestObj.m

@interface TestObj()
{
    int test;
}
@end

两者似乎都与我相同,在标题和实现中声明实例变量之间是否存在任何实际差异,如果不是首选?实现文件中的@interface似乎只是一种声明私有属性的方式,除此之外还有其他任何用途吗?

2 个答案:

答案 0 :(得分:15)

首选项通常是将私有实例变量和属性放在私有类扩展中(在.m中),并将公共接口文件(.h)保留为真正属于公共接口的属性和方法。

它有助于将实现细节与公共界面隔离开来,使一切更加清晰。它还确保外部类不会无意中更改此类的私有变量。

请参阅Class Extensions Extend the Internal Implementation

答案 1 :(得分:7)

Greg Parker对接受的答案的评论是最好的答案:

  

有一个功能差异:默认情况下,班级@interface中的ivars为@protected,类扩展名@interface或@implementation中的ivars为{{1}默认情况下。