1

我曾經爲iPhone開發過一些經驗,但完全是自學成才,並且試圖改進我的做法。這個問題可能很適合編程。如何在Objective-C中的對象實例之間維護數據?

什麼是最好的方式(或者是可能的),以維持實例變量與所共有的一個對象的所有實例的值?是否有可能在不同的地方創建,修改和檢查對象及其屬性?

說我有一個跟蹤用戶掃描屏幕的次數的對象。比如說,是否可以在我的AppDelegate中分配該對象,然後以某種方式從不同的視圖控制器中增加該對象的count變量?

是否有可能定義一個實例變量,使得它越過它所屬的對象的所有實例共享?這將解決問題。

在我的AppDelegate爲我所需要的跟蹤,然後只需訪問他們喜歡這個像這樣的事情到目前爲止,我剛剛做出的ivars:

((MyAppDelegate *)[UIApplication sharedApplication].delegate).instanceVariable 

但我不知道這是否是一種好的做法。可能不會。

也許這與全局變量或單例有關。或者上面顯示的「共享」前綴,我也在其他地方看到過。我只是尋找建議或看看的方向。我希望這個問題有意義,不是太籠統。

回答

2

我認爲你所問的問題涉及不同情況下的不同實踐。在視圖控制器之間共享數據是一個解決方案的問題,其中一個更好的方法是對所有視圖控制器使用委託。

如果你想有一個類管理自己的所有對象,即使對象來來去去,你可以做兩兩件事之一:

  1. 使課堂有單,並跟蹤分配和釋放,以便知道它應該何時創建並自行處理(如果需要)。這不是一個糟糕的做法,儘管它可能是更多的工作。

  2. 創建,管理您的其他類對象的控制器類。一個很好的例子可能是一類視圖,由視圖控制器類控制。

讓我們來看看其他人的建議。

+0

使用委託方法的問題是,作爲視圖控制器的數量增長,你必須保持沿參數傳遞,有時是在傳遞「到」幾個視圖控制器即使值僅實際上是第一個和最後一個視圖控制器關心價值。這是因爲這個原因我傾向於選擇單身人士組一樣的價值觀,這樣我可以存儲和利用價值的,他們最有意義的代碼,而不是必須通過所有的東西的地方。我更喜歡製作至少一個單例,而不是在AppDelegate中填充東西。 – 2010-01-20 07:02:21

0

我會考慮使用一個單獨的資源管理器 - 也許並不需要你的資源管理器的一部分,但一個單將極大地幫助你。

1

在C++或Java(等等),你會尋找一個「靜態實例變量」,這是你的描述正是:由類的所有實例共享一個實例變量。 Objective-C並沒有這樣的野獸,但是你可以使用一些正常的C語法來給你一些非常相似的東西。

看到這個頁面的底部: http://iosdevelopertips.com/objective-c/java-developers-guide-to-static-variables-in-objective-c.html

(代碼存在的情況下,頁面消失:)

@interface MyClass 
{ 
    // ... 
} 
+ (NSString *)myVar; 
+ (void)setMyVar:(NSString *)newVa; 
@end 

@implementation MyClass 
static NSString *myVar; 
+ (NSString *)myVar { return myVar; } 
+ (void)setMyVar:(NSString *)newVar { myVar = newVar; } 
@end 

在這種情況下複製「myVar的」是全球性的.m文件,但因爲它被標記爲「靜態」(這是一個C技巧),所以編譯器僅將它的可見性限制在它所在的.m文件中。(就像這樣,請注意多線程訪問,如果使用的話)。

FWIW,如果你是b通常需要強健的東西,每個人都分享一個類似單身的東西是一個很好的途徑;如果你這樣做,你會得到所有正常的Obj-C優點(如果你想要的話,可以使用mem管理)。

1

Matt Gallagher發表了一篇關於這個問題的文章。你可以在Cocoa with Love看到它。

但是,在mahboudz所說的多視圖控制器模式中,代表團是首選。

0

在應用程序委託中使用保存所有內容並在需要時訪問它是絕對不好的做法..至少意味着代碼重用變得棘手。如果你製作了一個新的應用程序,並希望使用視圖或控件或系統的一部分,還必須確保新的應用程序委託實現了所有正確的選擇器和屬性。 此外,隨着您的應用程序的增長,您將不可避免地發現您的應用程序代表變得越來越大,越來越混亂,越來越難以處理。
調試變得痛苦太多,因爲它是很難準確計算出哪些代碼都參與了一個特殊的問題。

我這樣做的目的是勾畫應用程序的哪些部分實際需要哪些信息,並在創建ViewController時將其傳遞給ViewControllers。

相關問題