【问题标题】:initWithArray:(NSArray *)array copyItems:(BOOL)flaginitWithArray:(NSArray *)array copyItems:(BOOL)flag
【发布时间】:2013-05-09 07:13:34
【问题描述】:
NSMutableDictionary *dic0 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"string0", @"key0", nil];
NSDictionary *dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"string1", @"key1", nil];
NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"string2", @"key2", nil];
NSDictionary *dic3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"dic3", @"key3", nil];

NSArray *arrayOri = [[NSArray alloc] initWithObjects:dic0, dic1, dic2, nil];

//here means a deep copy
NSMutableArray *arrayDeepCopy = [[NSMutableArray alloc] initWithArray:arrayOri copyItems:YES];

NSRange range = {0, 2};
NSArray *subArray = [arrayOri subarrayWithRange:range];
[arrayDeepCopy addObject:dic3];

NSLog(@"arrayOri not merge %@", arrayOri);

//merge one object
[dic0 setObject:@"mutableV" forKey:@"mutableKey"];
//dealloc one object
[dic1 dealloc];

NSLog(@"arrayOri %@  ", arrayOri);
NSLog(@"subArray %@  ", subArray);

这里crash,因为dic1被释放了,如果是深拷贝,为什么原来的对象对新的对象有影响??

NSLog(@"array %@  ", arrayDeepCopy);

what initWithArray:(NSArray *)array copyItems:(BOOL)flag  do after all??

【问题讨论】:

  • 您需要更好地解释您的问题。请不要只用 cmets 粘贴代码。这些很容易被忽视。用例子提问,请阅读faqtour

标签: nsmutablearray copy nsarray


【解决方案1】:

问题在于dic1 是一个不可变对象。因此将其复制到内存中是没有意义的,因此arrayDeepCopy 持有指向原始dic1 对象的指针。当您释放它时,它会从存储它的所有数组中消失。
如果你想要一个真正的深拷贝,你必须实例化一个NSMutableDictionary

【讨论】:

  • @user2365237:我的回答没有得到任何回应。因此,如果它解决了您的问题,请考虑接受它。如果仍有问题,请添加评论。
猜你喜欢
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2019-06-10
  • 2011-04-14
  • 2017-01-12
  • 2014-08-16
相关资源
最近更新 更多