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

Kev*_*lia 12 objective-c instance-variables header-files

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

在TestObj.h中

@interface TestObj : NSObject
{
    int test;
}
@end
Run Code Online (Sandbox Code Playgroud)

在TestObj.m中的vs

@interface TestObj()
{
    int test;
}
@end
Run Code Online (Sandbox Code Playgroud)

两者似乎都等同于我,在标题和实现中声明实例变量之间是否存在任何实际差异,如果不是首选?在@interface实现文件中似乎只是一个方法来声明私有属性,它有之外的任何其他目的?

Rob*_*Rob 15

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

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

请参阅类扩展扩展内部实现.

  • 有一个功能区别:类的`@interface`中的ivars默认是`@ protected`,默认情况下,类扩展名`@interface`或`@ implementation`中的ivars是`@private`. (6认同)

aca*_*828 7

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

还有一个功能上的差异:在类的实例变量@interfaceARE @protected默认情况下,高德和在类扩展@interface或者@implementation@private默认.