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这种不可变的容器。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐