2012-02-15 86 views
1

您如何比較2 NSMutableArray添加到NSUserDefaults - 初學者

不同的人可能會說這是一個重複的問題,但在查看大多數SO問題後,我還沒有找到解決我的問題的方法。

有一個Person對象,它具有字段Name, Age, Rank

我有一個MutableArray將從NSUserDefaults保存數據。那麼它會看到NSMutableArray是否包含該特定對象。如果沒有,它會將其添加到NSUserDefaults

當我將人物添加到NSUserDefaults(我正在通過數組添加人物對象,請參閱代碼)時,會出現一些問題。

當我打印[data count]它總是0。所以它可能沒有正確添加到NSUserDefaults。或者我可能會犯一些錯誤。

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 

      if (userDefaults) { 

       NSArray *arr= [userDefaults objectForKey:@"person"]; 

       data = [NSMutableArray arrayWithArray:arr]; 

NSLog (@"%i ", [data count]); 

       if (! [data containsObject:self.person]) { 

        [data addObject:self.person]; 

        NSArray *personarr= [NSArray arrayWithArray:data]; 

        [userDefaults setObject:personarr forKey:@"person"]; 

        [userDefaults synchronize]; 
+0

self.person是如何定義的? – ader 2012-02-15 17:16:44

+0

person對象在.h中定義併合成。它包含一個人的姓名,年齡和等級。我需要它被添加到NSUserDefaults。下面討論的 – shajem 2012-02-15 17:25:39

+0

使名稱,年齡和等級NSStrings和NSNumbers。 – ader 2012-02-15 17:37:50

回答

0

如果你從NSUserDefaults得到一個數組,它將永遠不會和任何當前對象(比如self.person)一樣是指針,所以這不會起作用。比較對象與==比較它們的內存地址。

如果您想比較它們,請使用它們的內容。 (例如[[person objectForKey: @"Name"] isEqualToString: [person2 objectForKey: @"Name"]])。所以你應該循環做檢查,如果新人的名字已經存在。

另外,arrayWithArray不是NSMutableArray的初始值設定項。 所以,如果它應該是可變的,那樣做:

NSArray *arr= [userDefaults objectForKey:@"person"]; 
data = [[arr mutableCopy] autorelease]; 

如果你的數始終爲零,檢查實際的數組內容,看看裏面什麼。 例如像這樣:

NSArray *arr= [userDefaults objectForKey:@"person"]; 
CFShow(arr); 
1

您可以實現您的Person類方法,它的數據導出到一個字典,和init方法將自己從相同的字典重建。正如Amorya指出的那樣,你不能將任何任意對象粘貼到NSUserDefaults中。

+0

我編輯了我的問題。我不是將一個人對象添加到NSUserDefaults,而是一個數組 – shajem 2012-02-15 17:26:37

+0

但是您的「數據」數組仍然包含一個Person對象。這不起作用。你必須轉換爲有效的對象,NSString,NSArray等,不只是將對象埋入數組中。 – picciano 2012-02-15 17:33:06

+0

你能舉個例子嗎? – shajem 2012-02-15 17:34:41

2

如果self.personPerson類的實例,那麼即使在數組中也不能將其放入用戶默認值中。從NSUserDefaults文檔:

值參數可以只是屬性列表對象:NSData,NSString,NSNumber,NSDate,NSArray或NSDictionary。對於NSArray和NSDictionary對象,其內容必須是屬性列表對象。

他們建議this爲進一步閱讀,其中列出算屬性列表對象的類型。

+0

根據代碼,我不添加人物。這是我添加的一個數組。 – shajem 2012-02-15 17:22:41

+0

看起來好像你的數組包含'Person'對象。這是不允許的。 – edc1591 2012-02-15 17:28:41

+1

是的,但你的數組_contains_ Person對象。它一直是屬性列表類型。 – jrturton 2012-02-15 17:29:55

0

您正在將您的Person對象保存在NSArray中,然後將NSArray保存到NSUserDefaults中,但這還不夠。在將它保存到NSUserDefaults之前,必須序列化Person對象。

本文將解釋這更好,我想:Storing custom objects in an NSMutableArray in NSUserDefaults

嘗試的NSLog(@ 「%@」 self.person);在你的if語句之前,因爲我懷疑它可能是零。

我希望對你有幫助。