2013-01-07 27 views

回答

0

,這樣你就不會弄亂AppDelegate中。大多數AppDelegates就像是全球數據的廚房水槽。一切都被扔進去了。使用單例(或者僅僅是一個常規的類,如果ARC)將你真實的全局數據從基本的AppDelegate函數中分離出來。

2

AppDelegate特定於您正在處理的項目。如果你決定開始一個新的版本的應用程序正在工作或(更可能)將它從iOS等端口到Mac ...

該AppDelegate將保持它的位置。

通過把這樣的全球信息爲您創建一個類,它是獨立的它正在被運行的應用程序的單身。

此外,你最好保持應用具體的東西(如applicationWillEnterBackground)在AppDelegate並不想阻塞其他東西。

1

如果你打算爲你的代碼創建單元測試,你應該避免使用全局單例,因爲它們會讓你的代碼更難測試。同樣,根據我的經驗,對這些值有一個暴露的NSArrayNSDictionary代碼可以很快地獲得bug。

我發現有用的設計模式實際上是用你想要的所有屬性製作一個配置或全局值對象。通常這個類包裝NSArrayNSDictionary,你可以從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]; 
} 

中當然,請改變物體的屬性以適合您的需求。這種方法的好處在於,只要處理應用程序的全局配置所需的通用代碼就可以實現,比如加載圖像。這有助於防止由於在代碼庫中複製同一代碼而導致的常見錯誤類別。

+0

正確!給予好評 – AlexWien

0

我不認爲Singeltons是一個很好的解決方案,我更喜歡應用程序全局更好地保存在一個誠實的全局訪問類,如AppDelegate。

18年前,一個單獨的構造被認爲是一種設計模式,但後來Erich Gamma意識到,將這種模式添加到他的書「設計模式 - 可重用面向對象軟件的元素」是一個壞主意」。

今天在現代語言如java Singeltons是邪惡的,因爲你不能刪除它們,一旦它們被初始化,從而嚴重干擾單元測試。所以至少在java中,當使用單例時,它更可能有不好的設計。說實話,如果你有一個全局對象,那麼就這樣處理它,並且不要將它隱藏在僞全局元素之後。

但是Objective-C沒有虛擬機,因此可能Singletons不會影響單元測試(我對此不確定)。
如果它們不影響單元測試,單例有時可以使用,比如[NSFileManager defaultManager]。
但我不會將NSArray或Dictionary存儲到單例中。