NSMutableArray等容器类的Copy注意事项
NSMutableArray 这一类容器类,即使使用copy或者mutableCopy方法,也只是拷贝了当前第一层元素的指针,并没有做更深层次的拷贝比如下面的代码中@interface ViewController ()@property (nonatomic, copy) NSArray* data;@property (nonatomic, strong) NSMutableDictiona
·
NSMutableArray 这一类容器类,即使使用copy或者mutableCopy方法,也只是拷贝了当前第一层元素的指针,并没有做更深层次的拷贝
比如下面的代码中
@interface ViewController ()
@property (nonatomic, copy) NSArray* data;
@property (nonatomic, strong) NSMutableDictionary* dictData;
@end
self.dictData = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@26, @"kein", @15,
@"mal", nil];//
NSMutableArray* arr = [[NSMutableArray alloc] init];
[arr addObject:self.dictData];
self.data = [arr mutableCopy];//拷贝Array
NSLog(@"data: %@", self.data);
这时的输出是
data: (
{
kein = 26;
mal = 15;
}
)
如果这时候从另外一个地方修改了字典里的值
[self.dictData setObject:@64 forKey:@"chiyun"];
NSLog(@"data: %@", self.data);
那么data也会被修改。
(
{
chiyun = 64;
kein = 26;
mal = 15;
}
)
可以看到,copy只是保证了修改arr这个变量,不会修改data里面的值,但是如果修改arr变量里,某个容器的内容,data同样会被修改,尽管data的声明是NSArray。
这个问题,我觉的最好的避免方法,是在往array里AddObject的时候,如果当前是NSArray,那么相应添加的对象,应该尽量使用NSDictionary这种不可变的容器。
更多推荐
已为社区贡献1条内容
所有评论(0)