2013-07-14 13 views
0

我正在寫一個iOS應用程序,其中有一個應用程序中的所有視圖都需要訪問的公共對象。iOS常用對象

我一直在創建並初始化viewDidLoad事件(第一個視圖控制器)內的對象,然後將對該對象的引用傳遞給所有需要它的視圖。這似乎不是正確的做事方式,感覺就像我以某種方式打破了MVC模式,因爲我依賴於這個特定的視圖總是首先加載,以便設置整個應用程序需要的對象。

我現在修改了我的應用程序,在appDelegate「didFinishLaunching ...」中完成基本對象的創建和初始化。這是現在正在工作,我可以從我的所有其他視圖訪問這個共同的對象,而不必傳遞從一個視圖到另一個視圖的參考。

在我走之前,我仍然希望讓人們意識到這是否是正確的做事方式,還是我應該做其他事情?對不起,如果這看起來像一個微不足道的問題,我只是在學習,並想學習如何正確地做事情。

在此先感謝:-)

回答

1

沒有重複已經回答的問題,我建議你讓自己的Singleton對象保存你的'全局變量',所以你不需要它與你的AppDelegate混亂。

@interface MyGlobalDataController : NSObject 

@property (nonatomic, strong) MyData *myData; 

+(MyGlobalDataController *)sharedInstance; 

@end 

@implementation MyGlobalDataController 

static MyGlobalDataController *MyGlobalDataControllerSharedInstance = nil; 

- (id)init { 
    self = [super init]; 
    if (self) { 
     // do whatever needs doing 
    } 
    return self; 
} 

+(MyGlobalDataController *)sharedInstance { 
    @synchronized(self) { 
     if (MyGlobalDataControllerSharedInstance == nil) { 
      MyGlobalDataControllerSharedInstance = [[MyGlobalDataController alloc] init]; 
     } 
    } 
    return MyGlobalDataControllerSharedInstance; 
} 

@end 

您訪問sharedInstance的第一次,init將被調用,所以你不必擔心時間在那裏。

+0

好吧,這很酷:-)讓我的單身人士起來工作,它的工作就像我需要它。再次感謝大家的幫助。 –

1

把你的全局對象初始化在didFinishLaunching比didLoad有一個更好的主意。

有些人會在這裏不同意我說你不應該擁有全局性的,但我個人認爲擁有某種全局狀態是可以接受的。我喜歡一個很好的面向對象的應用程序,但是在固體OOP和由幾個全局變量提供的靈活性之間有一個平衡點。

我認爲最終會做適合自己的一切,擁有全局狀態的主要缺點是它變得難以維護,並且有可能引入大量錯誤/意外行爲,尤其是在大型應用程序中,而如果你堅持使用MVC模式,然後應用程序中的每個視圖只是做它的意思,而不會不必要地影響應用程序的其他部分。現在,我傾向於大多數情況下堅持使用MVC/OOP原則,但是有一個[AppDelegate] sharedAppDelegate]單例,我可以在某些點使用它來訪問變量。我在這裏有非常非常少的變量,但他們確實派上用場,即現在我的應用程序有一個由該類管理的共享「加載HUD」,並且我的sharedAppDelegate還包含許多用於啓動HTTP,解析JSON等的靜態方法這節省了很多時間。

一種替代你的appDelegate有使用NSUserDefaults的存儲鍵值信息

希望幫助反正,就像我說的有些人會同意我的看法,但最終還是歸結到個人喜好全球信息和在MVC模型與靈活性剛性方面,你的平衡點是

+0

感謝您的回答,這讓我感覺自己在做什麼好一點。我完全同意你的看法,有時候它有一個「通用對象」(我試圖避免使用「全局」這個詞),它需要被其他視圖訪問。我覺得這種方式更符合MVC模式的精神,因爲對象與應用程序的運作更加鬆散耦合。這樣,理論上我應該能夠改變firstviewcontroller而不必將對象創建和init代碼添加到新的firstviewcontroller中。 –