我已声明NSMutableArray *arrAllRecordsM
并尝试使用NSMutableDictionary *dicRecordM
向其添加addObject
。 dicRecordM
已添加到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}}
答案 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
可用于许多类,例如NSDictionary
,NSArray
和NSString
以及它们的可变变体,以获得“功能独立的对象”。形式上,它适用于符合NSCopying
协议的所有类。
答案 1 :(得分:1)
这是预期的行为。
您通过调用removeAllObjects
从字典中删除了所有对象,然后尝试从中检索对象并正确地获取nil
,因为它不再存在于字典中(您将其删除)。 / p>
您可能不清楚的是NSArray
不会复制您添加到其中的元素,而只是拥有强大的参考。
因此,dicRecordM
和arrAllRecordsM
都持有对相同对象的引用,因此对它的任何修改(在本例中为removeAllObjects
)都会影响相同的字典。
顺便说一句,您不应该使用valueForKey:
来访问字典的条目。使用objectForKey:
或较短的下标语法。例如
self.arrAllRecordsM[0][@"ADDRESS"]
您可以阅读此答案Difference between objectForKey and valueForKey?作为参考,但主要问题是,如果密钥包含特殊的KVC字符,valueForKey:
与objectForKey:
的行为可能会有很大不同,例如{ {1}}或@
。