4

我已经想到了声明私有变量的不同方法。我想知道它们之间是否有任何区别。
第一种方式:

//In .h file
@interface DataExtract : NSObject
{   
    @private
    double test;
}

第二种方式:

//In .m file. test is not declared in .h file
static double test;

第三种方式:

//In .m file. test is not declared in .h file
double test;

任何帮助将非常感激。谢谢你。

4

4 回答 4

5

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

//DataExtract.m

@interface DataExtract ()
//your variables
@end

@implementation DataExtract

@end

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

于 2013-09-06T07:57:59.933 回答
5

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

于 2013-09-06T08:00:29.270 回答
5

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

第一种方式:

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

第二种方式:

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

第三种方式:

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

于 2013-09-06T09:22:37.660 回答
1

您是否有理由只想使用实例变量而不是属性?

您可以像这样声明私有属性:

// Private Interface in .m file
@interface DataExtract()

@property (nonatomic) double test;

@end

编辑:如果您确实想使用私有 ivar 而不是属性,您可以这样做:

// Private Interface in .m file
@interface DataExtract() {
    double test;
}

@end
于 2013-09-06T08:05:15.767 回答