2010-06-28 117 views
0

什麼是創建全局對象最簡單的方法。我試過在沒有運氣的情況下在對象之外聲明對象。全局對象iphone

@implementation UV_TouchpadViewController; 
NSMutableString *string = [NSMutableString stringWithFormat:@"text"]; 

回答

3

非常接近 - 您不能用非常量表達式初始化非局部變量,並且方法調用本質上是非常量的,即使它看起來應該是。所以基本上,將其更改爲

NSMutableString *string; 

,但如果它一定會在實現文件內使用(例如:其他類只能在它經過UV_TouchpadViewController得到,得不到/直接設置它(這也是推薦模式)),那麼說它是靜態的,像這樣

static NSMutableString *string; 

如果在另一方面,你也希望能夠直接從UV_TouchpadViewController外部訪問它,離開關靜,但增加

extern NSMutableString *string; 

到您的標題文件(class @interface之外),以及包含標題的人將能夠訪問它。 (注意,你可以在你的頭文件中加上NSMutableString *string;,但是這很快就變得不清楚了)

另外,如果你正在嘗試爲singleton類做這件事,(我想不出一個很好的理由有一個全局可變的字符串 - 你知道它們不是線程安全的嗎?)我建議首先閱讀蘋果的單身人士文檔,他們建議你使用ivars,而不是全局變量,即使是單身人士。然而,UV_TouchpadViewController甚至不應該是單身人士(如果它以任何方式視圖控制器),它應該只有一個實例,如果這是你想要的。

另一方面,如果您只想讓所有的UV_TouchpadViewController都可以訪問這個變量,請注意幾乎所有的語言都認爲這是一種糟糕的設計模式(全局變量很糟糕),您應該將其放入,比如說,你的應用程序委託(它保證有一個全局可訪問的實例),它可以是一個ivar +訪問器,通常被認爲是一個設置,並且(有一點額外的代碼)仍然存在。

編輯:

如果你想有一個維護全局狀態,這點我還是建議對單身 - 你應該創建一個類,例如像ApplicationState,負責處理所有應用程序的全局狀態作爲傳統模型 - 視圖 - 控制器模式中的模型對象。我不會在這裏詳細討論,因爲這將是谷歌搜索的高度冗餘。

在您的應用程序委託的某處添加ivar ApplicationState *state和相應的@property(以及實現文件中的@synthesize)。

+0

它聽起來像我需要一個單身人士,除非你可以幫助引導我在一個更好的方向。我實際上並沒有試圖通過我的視圖控制器創建一個共享字符串。我實際上有一個包含我的應用程序的所有邏輯的類,我需要初始化類的一個對象,並通過veiw控制器方法調用的所有調用保留。在全局初始化它似乎是合乎邏輯的,所以其他方法都可以訪問它的一個實例。這是否可以在AppDelegate中完成? – jcb344 2010-06-28 22:58:46

+0

是的,你最後的建議似乎是最好的 - 創建一個類來保存應用程序邏輯,你只需要一個實例,然後從只有一個實例的地方在伊娃創建一個實例,例如作爲應用程序代表。這樣你只需要[[UIApplication sharedApplication] .appDelegate.applogic somecall]。這看起來很醜陋,但是,如果你需要一個單身人士,這至少是最明確的路要走。另一方面,應用程序邏輯(遊戲通常儘管)應該真正進入高級視圖控制器,它只會被實例化一次。 – 2010-06-28 23:10:08

+0

您能否給出一些代碼示例,介紹AppDelegate.h,AppDelegate.m,viewcontrolloer.h和viewcontrolloer.m以實現和利用AppDelegate全局聲明和對象的init。我有點不確定如何設置這個方法,以及如何爲對象聲明和實例伊娃。謝謝。 – jcb344 2010-06-29 02:41:38

0

您是否需要它爲每個類的實例?如果是這樣,你應該把它變成一個實例變量。把

NSMutableString *string; 

在你的頭

然後你就可以將其設置在你的類中的任何方法。

如果這不是你的意思,更新你的問題或評論。

0

您可以通過在委託類中實現getter和setter來實現此目的。

在委託.h文件中

包含的UIApplication代表

@interface DevAppDelegate : NSObject <UIApplicationDelegate> 

    NSString * currentTitle; 

- (void) setCurrentTitle:(NSString *) currentTitle; 
- (NSString *) getCurrentTitle; 

在.M

-(void) setCurrentLink:(NSString *) storydata{ 
currentLink = storydata; 

} 

-(NSString *) getCurrentLink{ 
if (currentLink == nil) { 
    currentLink = @"Display StoryLink"; 
} 
return currentLink; 
} 

所以你評估變量在currentlink串通過制定者設定委託實現類方法和類你想要的字符串,只需使用getter方法。

AppDelegate *del=(AppDelegate *)[[UIApplication sharedApplication]delegate]; 
TO set: 
[del setCurrentLink]; 
TO Get: 
NSString *value=[del getCurrentLink]; 

所有最優秀的

0

地址:

NSMutableString *globalString = nil; 

任何對象的任何.m文件。 nil初始化增加了一點安全性,因爲nil對象可以「安全地」發送消息,而不會徹底崩潰應用程序。

地址:

extern NSMutableString *globalString;

添加到需要訪問此全局的任何其他對象的標頭。

地址:

if (globalString == nil) { 
    globalString = [ [ NSMutableString stringWithFormat:@"text"] retain ]; 
} 

任何類(ES)可能是最先接觸這一全球性的,或者一些初始化出現這種情況甚至更早的初始化。

全局變量是一種不太冗長的單例形式,但沒有訪問限制或跟蹤。謹慎使用。

1

有幾個簡單的方法來拍攝自己的腳比使用全局變量。

你不應該暴露一個愚蠢的對象,像一個字符串,它對應用程序中的每個對象都沒有訪問控制。隨着應用程序變得越來越大,應用程序中任何地方的任何隨機代碼都可以更改可變字符串,從而導致混亂。

通常當人們想要一個全局變量時,他們實際需要的是用戶默認值或數據模型。

用戶默認值(NSUserDefaults)是偏好持久性系統,可在啓動時和應用程序運行時保存應用程序狀態和用戶設置。您可以將少量數據(如字符串)保留爲默認值,並可以在應用程序的任何位置輕鬆訪問它們。

數據模型是專用對象,用於保存應用程序數據並管理對數據的訪問,以便只有數據模型才具有最終控制權。這可以很容易地告訴改變數據的方式和方式。數據模型可以是一個簡單的自定義類或者諸如核心日期之類的精心設計。您可以將數據模型駐留在應用程序委託中,或者將其作爲單例創建,如其他人所解釋的。

我一直在使用Apple API多年,而且我從不需要使用真正的全局變量。如果你認爲你需要它,你可能會誤解Apple API中的應用程序設計。你可能想發佈一個問題來解釋你想要用全局變量做什麼,以及在沒有使用全局變量的危險的情況下應該採取什麼樣的最佳策略。

0

實際上按照我的r &通過使用extern得到了,我們必須創建一個實例,但最終的事情是#define變量,並且可以訪問任何你想要的地方,而不需要直接創建實例和其他東西使用變量的名字....