我想到了声明私有变量的不同方法。我想知道他们之间是否有任何差异 第一种方式:
//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;
非常感谢任何帮助。谢谢。
答案 0 :(得分:5)
您可以在.m文件中声明私有@interface。
//DataExtract.m
@interface DataExtract ()
//your variables
@end
@implementation DataExtract
@end
有关详情,请访问here
答案 1 :(得分:5)
您的第二个和第三个示例不是实例变量,但全局变量(具有不同的范围)和相同的值将在整个过程中共享。
答案 2 :(得分:5)
如果你想要一个ivar,所有这些都不是一个好的解决方案。 我甚至倾向于只在实现文件的类扩展中使用自动生成的ivars属性只有一行(@synthesize在Objective-C 3.0中自动生成)。
第一种方式:
是的,这是一个ivar,但你不应该在头文件中声明它,如果你声明它@private,那么使用@implementation {...}块。在实现块中,您不需要声明它@private,因为它默认为@protected,但在实现块中它对于子类是不可见的
第二种方式:
这是一个仅在翻译单元中可见的变量,这里是.m文件本身。整个应用程序并不全球化。对于类的每个实例,该值都是持久的,因此它不是ivar(实例变量)。
第三种方式:
这也不是ivar,它是一个默认为extern的变量,因为你没有写静态。这意味着它位于全局符号表中,如果#import /#包含.m文件,则可以在其他翻译单元/文件中使用。
答案 3 :(得分:1)
您是否有理由只想使用实例变量而不是属性?
您可以声明私有财产:
// Private Interface in .m file
@interface DataExtract()
@property (nonatomic) double test;
@end
编辑: 如果你想使用私人ivar而不是属性,你可以这样做:
// Private Interface in .m file
@interface DataExtract() {
double test;
}
@end