2013-11-24 72 views
0

我已聲明NSMutableArray *arrAllRecordsM,並且正試圖使用​​addObjectNSMutableDictionary *dicRecordM添加到它。 dicRecordM被添加到arrAllRecordsM,但在做[dicRecordM removeAllObjects]時,它將在arrAllRecordsM中設置爲零。下面是代碼,請幫我修復它。NSMutableArray addObject在釋放對象後設置爲零

self.arrAllRecordsM = [NSMutableArray array]; 
self.dicRecordM = [NSMutableDictionary dictionary]; 

//一些方法

[self.dicRecordM setObject:@"Test" forKey:@"ADDRESS"]; 
[self.arrAllRecordsM addObject:self.dicRecordM]; 

// Value: Test 
NSLog(@"Value: %@", [[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"]); 
[self.dicRecordM removeAllObjects]; 

// Value: null 
NSLog(@"Value: %@", [[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"]); 
+2

您的代碼行爲正常。你爲什麼期望得到不同的結果?你試圖獲得一個不存在的價值。當然,它會返回'nil'。 – rmaddy

回答

4

將對象添加到一個NSMutableArray只是存儲指針(或「強參考」) 到對象到陣列。因此

[self.arrAllRecordsM objectAtIndex:0] 

self.dicRecordM 

是兩個指針給同一對象。如果您從self.dicRecordM刪除所有鍵/值對,則[self.arrAllRecordsM objectAtIndex:0]仍指向相同的 (現在爲空)字典。這就是爲什麼

[[self.arrAllRecordsM objectAtIndex:0] valueForKey:@"ADDRESS"] 

返回nil

如果你想在陣列中的字典的獨立副本,使用

[self.arrAllRecordsM addObject:[self.dicRecordM copy]]; 

copy可以在許多類中使用,如NSDictionaryNSArrayNSString 及其可變的變量,得到一個「功能獨立的對象「。形式上,它適用於符合NSCopying協議的所有類別。

1

這是正常現象。 您通過調用​​刪除字典中的所有對象,然後嘗試從中檢索對象並正確獲取nil,因爲它不再存在於您的字典中(您已將其刪除)。

您可能不清楚的是NSArray不會複製您添加到它的元素,而只是擁有強大的參考。

所以既dicRecordMarrAllRecordsM和持有到相同對象的引用,因此任何修改它(在這種情況下​​)會影響相同的字典。


順便說一句,您不應該使用valueForKey:訪問字典的條目。使用objectForKey:或更短的下標語法。例如

self.arrAllRecordsM[0][@"ADDRESS"] 

你可以閱讀這個答案Difference between objectForKey and valueForKey?作爲參考,但主要的問題是,valueForKey:可以表現從objectForKey:非常不同的情況下,主要包含特殊字符KVC,如@.

相關問題