2012-01-10 120 views
12

如何在main.m文件中聲明一個變量,以便它在所有類中都可用?objective-c - 全局變量

如果我只是在main函數中聲明它,編譯器會說它在類方法中是未聲明的。

我必須在這樣的對象中聲明它嗎?

@public 
type variable; 

回答

25

所有你需要的是使用普通的舊C全局變量。

首先,在你main.m定義一個變量,你main函數之前:

#import <...> 

// Your global variable definition. 
type variable; 

int main() { 
    ... 

其次,你需要讓其他源文件瞭解它。你需要聲明它在一些.h文件並導入該文件中的所有你需要的變量.m文件:

// .h file 

// Declaration of your variable.  
extern type variable; 

請注意,您不能賦值在聲明塊變量,否則就變成了一個定義變量,並且以鏈接器錯誤結束抱怨同一名稱的多個定義。

爲了把事情說清楚:每個變量可以是宣佈多次(宣言說,這個變量存在於某個地方),但定義只有一次(定義實際上該變量創建的內存)。

但要小心,全局變量是一種錯誤的編碼習慣,因爲它們的值可能會在任何文件中被意外更改,因此您可能會遇到很難調試的錯誤。例如,您可以使用單例模式避免全局變量。

+0

伊莫,全局變量實際上使大量的目標C意義上說,鑑於趨勢的很多事情自然會單身人士,尤其是視圖控制器。在這種情況下,它們更像常量而不是變量。 – devios1 2013-08-04 04:39:51

+0

實際上,單身人士使用全局變量 - 共享實例 - 從而使每個成員都成爲全局變量;你只能用另一種替代一種全球性。 – Cristik 2015-10-22 08:43:58

10

不太確定你爲什麼要這樣做,但你可以,如果你想。

的main.m:

int someGlobal = 0; ///< Added outside any function, at the top say. 

SomeClass.m:

extern int someGlobal; ///< Added at the top, outside the class implementation. 

... 

- (void)useGlobal { 
    NSLog(@"someGlobal = %i", someGlobal); 
    someGlobal = 5; 
    NSLog(@"someGlobal = %i", someGlobal); 
} 

但請仔細想一想在開始使用這樣的事情之前!

+0

爲什麼要小心?我不明白風險會是什麼 – Sirens 2013-03-25 18:37:19

+1

風險將是不可維護的代碼或可能很難追蹤錯誤。 – mattjgalloway 2013-03-25 20:03:54

+0

我在互聯網上看到的關於全球變量的每一篇文章都有關於「小心」的警告,還有一些人說「爲什麼要小心?」。哈哈,它總是一樣的爵士樂。 那些不想小心的人:認爲其他人一次又一次地警告你的隱藏理由;) – tothemario 2014-08-18 18:55:19

2

除了調試,我沒有理由甚至嘗試修改main.m文件以直接與您的應用程序邏輯進行交互。

如果符合您的需要,您可以嘗試在Your_project_name_Prefix.pch文件上定義常量。或者在應用程序委託或應用程序的任何類中聲明一個靜態變量。

要了解更多關於常量和靜態變量,請點擊此鏈接:

http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

+0

但是,如果你需要對var的readwrite訪問,這是行不通的。 E.例如,如果您想存儲所有類都可以訪問的密碼或會話ID。 – 2014-05-27 11:29:16