未申报的伊娃?

时间:2010-09-16 13:26:33

标签: objective-c instance-variables

我遇到过Objective-C代码,它在.m文件中的@implementation行下方声明一个变量,而不是在.h文件的@interface块中。然后它继续像私人ivar一样使用它。我无法找到有关以这种方式声明变量的文档,并希望了解其影响。

示例:

·H

@interface MyClass {
    @private
    int _myPrivInt1;
}
@end

的.m

@implementation
int _myPrivInt2;
@end

问题:

这两个变量之间的技术差异是什么?

是否与使用@private修饰符在.h @interface块中声明ivar相同,还是更像是C全局变量?

以这种方式声明变量有什么影响吗?

应该避免吗?

是否有一个术语来声明像_myPrivInt2这样的变量,这会使我的Google搜索更加成功?

1 个答案:

答案 0 :(得分:3)

您必须在接口块中声明实例变量。

@implementation
int _myPrivInt2;
@end

以这种方式声明变量,您实际上并没有为您的类声明iVar。 _myPrivInt2将是一个全局变量,可以使用extern声明从代码的任何部分访问:

// SomeOtherFile.m
extern int _myPrivInt2;
...
_myPrivInt2 = 1000;

您可以检查 - 在SomeOtherFile.m中的代码执行后,您的_myPrivInt2变量将等于1000。

您还可以为_myPrivInt2指定静态链接说明符,以便只能在当前翻译单元中访问

@implementation
static int _myPrivInt2; // It cannot be accessed in other files now
@end