2012-02-09 217 views
0

我想對自己做一些關於全局變量的命令。c目標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時,我可以使用它嗎?或者是否必須讓該類的對象才能看到它?

什麼是最好的方式來放置一個原語的全局變量,只有我的班級會看到它,並可以使用它?

回答

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他們的實例變量。使用

如果你需要一個私人全局變量,定義它在你實現文件:

static int ran; 
+0

謝謝大家。換句話說,如果我需要一個全局性的外部類,我會做「外部」,如果我需要一個變量是全球內部類只有我做「靜態」詮釋?因爲人們警告我靜靜的開始 – Curnelious 2012-02-09 14:18:08

1

任何類聲明或實現之外,

int ran; 

定義了一個名爲intran變量,不管該行是否在.h.c.m文件。通常這是一個錯誤,將它放在.h中,因爲如果多個文件包含此.h,則該變量會被定義兩次或更多次。

extern int ran; 

指定一個名爲int類型的ran變量已在別處定義和鏈接器應該能找到它。

通常,(在Objective-C,從而在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;在你需要它。

0

情況下,1,2,3是全球性的,4是不是