c目标c中的全局变量

时间:2012-02-09 09:24:44

标签: objective-c

我想对全局的自己做一些命令。

  1. 如果我写入我的.m文件

    int ran //is it global? every class can see it ?
    
    @implementation
    @end
    
  2. 如果我在我的.h文件中写这个:

    int ran //is it global to any other class that include this .h ?
    @interface
    {
    }
    
  3. 如果我在我的.h文件中写这个:

    extern int ran //is it global to any other class that include this .h ?
    @interface
    {
    }
    
  4. 如果我在我的.h文件中写这个:

    @interface
    {
    int ran //can every other class that include it can see it ?
    }
    

    AND关于@interface,界面中的每一件事只属于那个类? @interface中的*NSString怎么样?它只属于那个班级吗? 包括这个.h可以用它吗?或者我是否必须让该类的对象才能看到它?

  5. 放置基元的全局变量的最佳方法是什么,只有我的类会看到它并且可以使用它?

3 个答案:

答案 0 :(得分:1)

在任何课程声明或实施之外,

int ran;

定义了ran类型的int变量,无论该行是.h.c还是.m文件。通常将它放在.h中会出错,因为如果多个文件包含此.h,则变量将被定义两次或更多次。

extern int ran;

指定在其他地方定义了ran类型int的变量,并且链接器应该能够找到它。

通常,在C中(以及在Objective-C中)声明全局变量的一般结构是:

globals.h:

extern int ran;

global.c:

int ran;

myWonderfulApp.m:

#import "globals.h"
...
ran = 42;

如果您需要从.m外部看不到的全局变量,请使用:

static int ran;

如果你提供了getter和setter,你仍然可以从外面使用它,但如果你在需要的地方声明extern int ran;,则不能。

答案 1 :(得分:1)

  1. 如果你写(在任何编译单元== .m文件中)

    int ran;
    

    很好,定义一个全局变量,初始化为零,符号对链接器可见。

  2. 如果您在头文件中写入

    int ran;
    

    这是个坏主意,因为包含标头的每个实现文件(.m)都会定义它自己的全局变量实例。链接器会出现混淆。

  3. 如果您在头文件中写入

    extern int ran;
    

    很好,声明一个全局变量。必须在一个实施文件(.m)中定义。

  4. 如果您在头文件中写入

    @interface Foo : NSObject
    {
        int ran;
    }
    

    也没关系。它声明了一个带有实例变量ran的Objective-C类。将为Foo的每个实例创建并属于实例变量。实例变量是@protected(默认情况下),因此可以直接从任何派生类访问。不过,这将是糟糕的设计。

    现在你不会在一个类的@interface中声明实例变量,而是在@implementation@synthesize中声明它们。

  5. 如果您需要私有全局变量,请使用以下命令在实现文件中定义:

    static int ran;
    

答案 2 :(得分:0)

案例1,2,3是全球性的,4不是