2012-04-09 28 views
0

我想保存在名爲MyPos.h類使用NSCoding方法的一些數據:如何實現applicationWillTerminate在appDelegate.m

  • (void)encodeWithCoder:(NSCoder *)aCoder
  • (id)initWithCoder:(NSCoder *)aDecoder

這些MyPos.m文件中已經實現了兩種方法。

現在我希望應用程序在數據完成啓動時終止並加載數據時保存數據。我想在AppDelegate.m文件中實現to方法,但是我無法理解如何保存包含數據的MyPos類的實例。

這是AppDelegate.m文件中的兩種方法之一...到目前爲止:

- (void)applicationWillTerminate:(UIApplication *)application { 


NSMutableData *data = [[NSMutableData alloc] init]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 

[archiver encodeObject: **HELP_HERE!** forKey:@"myPos"]; 
[archiver finishEncoding]; 

[data writeToFile:[self dataFilePath] atomically:YES];} 

我怎樣才能解決這個問題? 非常感謝。

+0

您的應用程序委託中是否有MyPos類的實例?保存實例... – jmstone617 2012-04-09 16:15:48

+0

''applicationWillTerminate''有點無用。你最好在''applicationWillEnterBackground''中實現你的寫程序,或者「儘快」。從iOS 4開始,當按住home時,您的應用程序將不會收到「applicationWillTerminate」。如果您的應用程序在後臺,並且由於內存不足導致您的應用程序被終止,您將不會收到「applicationWillTerminate」。 – 2012-04-09 16:21:31

+0

我有三個班。 AppDelegate,MyPos和一個ViewController。 ViewController創建一個MyPos實例來保存數據。 AppDelegate還創建一個MyPos實例來保存對象。但是,如果我在applicationDidEnterBackground的末尾添加一個NSLog來檢查MyPos實例的屬性,它們都會顯示爲空。我有感覺,我正在處理兩個不同的對象 - 或者至少有一個缺失的鏈接。有什麼想法嗎?謝謝一堆。 – gotfunk 2012-04-09 19:23:26

回答

1

我認爲你應該在「applicationWillEnterBackground」方法中編寫這些代碼,因爲當應用程序在後臺和用戶殺死它時,那麼applicationWillTerminate中的代碼可能無法工作。

2

兩件事情:

  1. 但對於**HELP_HERE!**,你的儲蓄方法看起來不錯。將該佔位符替換爲包含數據的MyPos實例的引用。您如何引用該實例取決於它在應用程序委託中的引用方式。它是財產還是伊娃?使用它。它是否屬於程序中的其他對象(比如視圖控制器)?見下文。

  2. 注意,在大多數情況下,*上iOS 4以上版本,應用程序將不會看到willTerminate事件 - 你會看到willResignActivedidEnterBackground,但當OS去終止你的應用程序,因爲它需要更多的RAM,你的應用程序已經被暫停,所以你將沒有機會對這個事件做出反應。您可能想要做出迴應,以響應事件。 (雖然你也可以考慮儘快保存的數據的變化。)

每一個我所提到的這些「事件」的是你可以要麼via an app delegate messageby subscribing to a notification迴應 - 無論使用哪一個適合您情況。如果需要保存的數據由應用程序委託(比如視圖控制器)以外的對象維護,那麼讓該對象執行保存以響應通知可能更有意義。

有關iOS 4+中應用程序生命週期事件的更多詳細信息,請參閱here's a good overview


(*)請注意,你仍然可以得到willTerminate如果)你正在使用支持的後臺執行的模式之一,如播放音頻或VoIP服務,B)您的應用程序被編譯爲一個SDK在4.0之前,或者c)您已經在您的Info.plist中將UIApplicationExitsOnSuspend密鑰設置爲YES。但是,最後一個選項意味着您放棄暫停/恢復功能的好處。