2011-11-30 45 views
0

我正在使用XCode 4.2開發應用程序,並且在應用程序的一部分中,我需要將NSString格式字符串存儲在UITableView中,並在應用程序重新啓動...Objective C將數據保存在UItableView視圖中,即使在關閉應用程序後

數據保存在NSMutableArray變量中。我發現,用一個老XCodeversion說了這段代碼的教程:

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

    NSArray *archivedArray = [NSKeyedUnarchiver unarchiveObjectWithFile:[self dataFilePath]]; 
    if (archivedArray == nil) { 

     data = [[NSMutableArray alloc] init];     

    } else { 
     data = [[NSMutableArray alloc] initWithArray:archivedArray]; 
    } 
} 

這個功能

-(NSString *)dataFilePath{ 

    NSString *dataFilePath; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [paths objectAtIndex:0]; 
    dataFilePath = [documentDirectory stringByAppendingPathComponent:@"Test App-Info.plist"]; 
    return dataFilePath; 

} 

我得到了以下兩個問題:

1 - 數據不保存...即使當我切換視圖 2-當我停止從設備的應用程序(即我雙擊主要按鈕,並從正在運行的應用程序列表中刪除它)應用程序崩潰:它去到這

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class])); 
    } 
} 

,並在行:return UIApplicationMain(argc, argv, nil, NSStringFromClass([HelloWorld18AppDelegate class]));我得到一個綠色的錯誤Thread 1 : program received a signal "SIGKILL".

任何想法,爲什麼它是做什麼?

編輯: 如果在我的描述缺失的信息,請讓我知道

編輯: 問題:

數據使用此功能

-(void)saveData{ 
    [NSKeyedArchiver archiveRootObject:[data copy] toFile:[self dataFilePath]]; 
} 

編輯保存:我可能需要有一個loadData函數嗎?如果是的話需要在裏面呢?

+0

我看不到正在保存你的數據在哪裏。 – user523234

+0

感謝您的回覆,我編輯我的問題 – user1051935

+0

我編輯我的問題感謝 – user1051935

回答

-1

試着讓應用程序在後臺運行。轉到Xcode中的info.plist文件並添加一個鍵應用程序不會在後臺運行並將其設置爲NO

對於SIGKILL錯誤,它看起來像是內存問題。嘗試使用NSZombies調試程序。

+0

我改變了plist中值,你教我,什麼都沒有發生,當我切換視圖表中的他仍然得到的數據擦除,即使... 而內存泄漏問題消失了......我打掃應用程序,一切都很好... – user1051935

0

如果您歸檔字符串數組,則不需要使用NSKeyedArchiver; NSArray提供了writeToFile和initWithContentsOfFile方法。嘗試一下,因爲你不會對發生的事情感到困惑。當你這樣做時,使用結果來查看它們是否成功(例如,我注意到你沒有捕獲到告訴你數據是否被保存的BOOL)。

您需要獨立於Xcode運行此操作,因爲如果應用程序是從Xcode啓動的,則無法使用描述強制退出應用程序的技術 - 如果這樣做,您將會崩潰。相反,您必須通過運行應用程序加載到模擬器或設備上,在Xcode中停止應用程序,然後獨立使用模擬器或設備上的應用程序。現在,不幸的是,你不能再在Xcode中看到這個應用程序,所以你將不得不插入大量的NSLog語句,稍後再研究控制檯,看看發生了什麼。

+0

我很新的應用程序developpment,你介意給我一個代碼示例? – user1051935

0

是的,你需要一個loadData方法。您可能想要在您的應用代理的application:didFinishLaunchingWithOptions:或您的視圖控制器的viewDidLoad中調用它。它應該是這個樣子:

- (void)loadData 
{ 
    data = [NSKeyedUnarchiver unarchiveObjectWithFile:self.dataFilePath]; 
} 

馬特指出的那樣,你也可以使用NSArraywriteToFile:atomicallyarrayWithContentsOfFile:方法。

關於SIGKILL:這是正常的行爲。當你「在主鍵雙擊並運行應用程序的列表中刪除」,系統SIGKILL發送。 SIGKILL信號以極端偏見終止接收過程。如果你不想讓你的應用程序獲得SIGKILL,不「從運行的應用程序的列表中刪除」。

+0

您好羅布 我試圖把它放在了viewDidLoad中的功能和它的作品,除了以下情況完全正常: 當我(在主鍵雙clicing和運行的應用程序的列表中刪除)終止該應用程序切換視圖中的數據被刪除時,甚至當我調用該函數loadData 謝謝你的SIGKILL信息數據被刪除 ,我會記住它的未來 – user1051935

相關問題