Objective-C:声明私有变量的不同方式.他们之间有什么不同?

Cod*_*elp 4 objective-c

我想到了声明私有变量的不同方法.我想知道它们之间是否有任何差异.
第一种方式:

//In .h file
@interface DataExtract : NSObject
{   
    @private
    double test;
}
Run Code Online (Sandbox Code Playgroud)

第二种方式:

//In .m file. test is not declared in .h file
static double test;
Run Code Online (Sandbox Code Playgroud)

第三种方式:

//In .m file. test is not declared in .h file
double test;
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.谢谢.

Max*_*ang 5

您可以在.m文件中声明私有@interface.

//DataExtract.m

@interface DataExtract ()
//your variables
@end

@implementation DataExtract

@end
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,您可以去这里


tro*_*foe 5

您的第二个和第三个示例不是实例变量,但全局变量(具有不同的范围)和相同的值将在整个过程中共享.


Bin*_*ian 5

如果你想要一个ivar,所有这些都不是一个好的解决方案.我甚至倾向于只在实现文件的类扩展中使用自动生成的ivars属性只有一行(@synthesize在Objective-C 3.0中自动生成).

第一种方式:

是的这是一个ivar,但你不应该在头文件中声明它,如果你声明它@private,然后使用@implementation {...}块.在实现块中,您不需要将它声明为@private,因为它默认为@protected,但在实现块中它对于子类是不可见的

第二种方式:

这是一个仅在翻译单元中可见的变量,这里是.m文件本身.整个应用程序并不全球化.对于类的每个实例,该值都是持久的,因此它不是ivar(实例变量).

第三种方式:

这也不是ivar,它是一个默认为extern的变量,因为你没有写静态.这意味着它位于全局符号表中,如果#import /#包含.m文件,则可以在其他翻译单元/文件中使用.