释放对象后,NSMutableArray addObject设置为nil

时间:2013-11-24 17:55:08

标签: ios objective-c cocoa-touch

我已声明NSMutableArray *arrAllRecordsM并尝试使用NSMutableDictionary *dicRecordM向其添加addObjectdicRecordM已添加到arrAllRecordsM,但在[dicRecordM removeAllObjects]执行时,arrAllRecordsM中的self.arrAllRecordsM = [NSMutableArray array]; self.dicRecordM = [NSMutableDictionary dictionary]; 设置为nil。以下是代码,请帮我解决。

[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"]); 

//一些方法

{{1}}

2 个答案:

答案 0 :(得分: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 :(得分:1)

这是预期的行为。 您通过调用removeAllObjects从字典中删除了所有对象,然后尝试从中检索对象并正确地获取nil,因为它不再存在于字典中(您将其删除)。 / p>

您可能不清楚的是NSArray不会复制您添加到其中的元素,而只是拥有强大的参考。

因此,dicRecordMarrAllRecordsM都持有对相同对象的引用,因此对它的任何修改(在本例中为removeAllObjects)都会影响相同的字典。


顺便说一句,您不应该使用valueForKey:来访问字典的条目。使用objectForKey:或较短的下标语法。例如

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

您可以阅读此答案Difference between objectForKey and valueForKey?作为参考,但主要问题是,如果密钥包含特殊的KVC字符,valueForKey:objectForKey:的行为可能会有很大不同,例如{ {1}}或@