您的位置:首页 > 运维架构

NSMutableArray等容器类的Copy注意事项

2015-08-10 17:32 435 查看
NSMutableArray 这一类容器类,即使使用copy或者mutableCopy方法,也只是拷贝了当前第一层元素的指针,并没有做更深层次的拷贝

比如下面的代码中

[code]@interface ViewController ()
@property (nonatomic, copy) NSArray* data;
@property (nonatomic, strong) NSMutableDictionary* dictData;
@end


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


这时的输出是

[code]data: (
        {
        kein = 26;
        mal = 15;
    }
)


如果这时候从另外一个地方修改了字典里的值

[code][self.dictData setObject:@64 forKey:@"chiyun"];
    NSLog(@"data: %@", self.data);


那么data也会被修改。

[code](
        {
        chiyun = 64;
        kein = 26;
        mal = 15;
    }
)


可以看到,copy只是保证了修改arr这个变量,不会修改data里面的值,但是如果修改arr变量里,某个容器的内容,data同样会被修改,尽管data的声明是NSArray。

这个问题,我觉的最好的避免方法,是在往array里AddObject的时候,如果当前是NSArray,那么相应添加的对象,应该尽量使用NSDictionary这种不可变的容器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: