回答
,這樣你就不會弄亂AppDelegate中。大多數AppDelegates就像是全球數據的廚房水槽。一切都被扔進去了。使用單例(或者僅僅是一個常規的類,如果ARC)將你真實的全局數據從基本的AppDelegate函數中分離出來。
AppDelegate特定於您正在處理的項目。如果你決定開始一個新的版本的應用程序正在工作或(更可能)將它從iOS等端口到Mac ...
該AppDelegate將保持它的位置。
通過把這樣的全球信息爲您創建一個類,它是獨立的它正在被運行的應用程序的單身。
此外,你最好保持應用具體的東西(如applicationWillEnterBackground)在AppDelegate並不想阻塞其他東西。
如果你打算爲你的代碼創建單元測試,你應該避免使用全局單例,因爲它們會讓你的代碼更難測試。同樣,根據我的經驗,對這些值有一個暴露的NSArray
或NSDictionary
代碼可以很快地獲得bug。
我發現有用的設計模式實際上是用你想要的所有屬性製作一個配置或全局值對象。通常這個類包裝NSArray
或NSDictionary
,你可以從plist文件加載。該對象可以在AppDelegate中實例化,然後在實例化視圖控制器和其他對象時傳遞。這是更容易測試的,因爲你可以輕鬆地在測試中模擬配置對象。
如何這種配置對象可能看起來當被從plist文件加載一個例子:
接口:
@interface ConfigManager : NSObject {
}
@property (readonly) NSString* masterUser;
@property (readonly) UIImage* masterUserImage;
@end
然後在.M
@interface ConfigManager()
@property (strong) NSDictionary* configDict;
@end
@implementation ConfigManager
-(id)init {
self = [super init];
if (self) {
NSString *pathStr = [[NSBundle mainBundle] pathForResource:@"AppConfig" ofType:@"plist"];
NSData *plistData = [NSData dataWithContentsOfFile:pathStr];
NSString *error = nil;
NSPropertyListFormat format;
self.configDict = (NSDictionary*)[NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
if(nil == self.configDict || nil != error) {
NSLog(@"%@",error);
return nil;
}
}
return self;
}
-(NSString*)masterUser {
return [self.configDict objectForKey:@"masterUser"];
}
-(UIImage*)masterUserImage {
NSString* imageName = [self.configDict objectForKey:@"masterUserImage"];
return [UIImage imageNamed:imageName];
}
中當然,請改變物體的屬性以適合您的需求。這種方法的好處在於,只要處理應用程序的全局配置所需的通用代碼就可以實現,比如加載圖像。這有助於防止由於在代碼庫中複製同一代碼而導致的常見錯誤類別。
正確!給予好評 – AlexWien
我不認爲Singeltons是一個很好的解決方案,我更喜歡應用程序全局更好地保存在一個誠實的全局訪問類,如AppDelegate。
18年前,一個單獨的構造被認爲是一種設計模式,但後來Erich Gamma意識到,將這種模式添加到他的書「設計模式 - 可重用面向對象軟件的元素」是一個壞主意」。
今天在現代語言如java Singeltons是邪惡的,因爲你不能刪除它們,一旦它們被初始化,從而嚴重干擾單元測試。所以至少在java中,當使用單例時,它更可能有不好的設計。說實話,如果你有一個全局對象,那麼就這樣處理它,並且不要將它隱藏在僞全局元素之後。
但是Objective-C沒有虛擬機,因此可能Singletons不會影響單元測試(我對此不確定)。
如果它們不影響單元測試,單例有時可以使用,比如[NSFileManager defaultManager]。
但我不會將NSArray或Dictionary存儲到單例中。
- 1. 添加全局字典
- 2. 將字典添加到字典
- 3. Nhunspell C#將單詞添加到字典
- 4. 添加類到字典
- 5. 靜態類vs單身類
- 6. 將本地字典複製到全局字典
- 7. 字將不會被添加到字典
- 8. OpenCL - 添加到單個全局值
- 9. 無法將字體添加到字典
- 10. 修身框架添加全局函數
- 11. 將全局回調添加到$ .ajaxSetup
- 12. 將全局變量添加到範圍
- 13. 將元素添加到全局變量
- 14. 將字段添加到字典項目
- 15. 將NSMutableDictionary添加到NSMutableDictionary將字典添加爲字符串
- 16. 類使用文字全局VS本地
- 17. 將對象添加到字典
- 18. 將數據添加到字典
- 19. obj-c將c-struct添加到字典
- 20. 如何在Three20的AppDelegate中添加全局右鍵按鈕(UINavigationController)
- 21. 將字典值添加到數組中
- 22. 如何將觀察者添加到AppDelegate?
- 23. 將多個值添加到python字典
- 24. 如何將格式添加到javascript的數字顯示全局
- 25. 並行字典AddOrUpdate vs索引添加
- 26. 添加一個ViewController到Appdelegate
- 27. 將文本添加到全局類中的靜態列表中
- 28. Android將項目添加到全局上下文菜單
- 29. 添加到字典中c#
- 30. Angular2將類添加到身體標記
你從哪裏看到該建議? – AlexWien
不是官方的建議,只是堆棧溢出的線程 –