我剛剛注意到我的iPhone/iPad應用程序中存在一個相當嚴重的錯誤:我有一個名爲AppDelegate
的類,它實現UIApplicationDelegate
協議 - 就像每個iPhone應用程序一樣。我正在使用核心數據,並且AppDelegate
設置了我的託管對象上下文(我大多隻保留了Xcode模板的默認方法)。AppDelegate的兩個實例,如何解決?
現在我需要在我的應用程序的一些地方管理對象上下文,我還想從幾個地方調用-saveContext
方法。所以我用了單件模式,並添加一個類的方法+ (AppDelegate *)sharedAppDelegate
是這樣實現的:
+ (AppDelegate *)sharedAppDelegate
{
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred,^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
一切正常爲止。然而,現在我試圖訪問sharedAppDelegate
的UIWindow
屬性,並注意到它是nil
。起初我很困惑,但後來我意識到,我的第一個方法main
創建的AppDelegate
一個實例,它創建於-application:didFinishLaunchingWithOptions:
的UIWindow
和視圖控制器,然後,-sharedAppDelegate
創建另一個!我覺得很奇怪,我的應用程序似乎目前工作得很好,因爲例如只有第一個實例在應用程序存在時調用-saveContext
。
無論如何,我想改變它,以便main
方法也使用sharedAppDelegate
。這是否意味着我需要重寫-init
方法?我怎樣才能防止無限循環(-sharedAppDelegate
畢竟也調用init)?我應該使全球範圍的變量_sharedObject
?
爲什麼選擇倒票? – fabian789 2011-12-26 10:56:24