结论
- copy自不可变、或者mutableCopy自可变、不可变的容器,都是容器对象的深拷贝
- 上面的深拷贝只是容器对象,容器里的值还是浅拷贝的
- 使用copy修饰property、直接copy 可变字典两种情况,查看容器对象和容器里值的地址情况:
#import <Foundation/Foundation.h>
@interface TestObject : NSObject
@property(nonatomic, copy) NSDictionary *dic;
@property(nonatomic, strong) NSDictionary *testDic;
@end
#import "TestObject.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] init];
mutableDic[@"Name"] = @"kailinWang";
mutableDic[@"Age"] = @"18";
NSDictionary *copyDic = [mutableDic copy];
TestObject *obj = [[TestObject alloc] init];
obj.dic = mutableDic;
obj.testDic = mutableDic;
NSLog(@"不可变的地址是%p,copy属性的地址是%p, strong属性的地址是%p, copyDic的地址是%p",mutableDic, obj.dic, obj.testDic, copyDic);
NSLog(@"不可变Name地址是%p,copy属性的Name地址%p,strong属性的Name地址是%p, copyDic的Name的地址是%p",mutableDic[@"Name"],obj.dic[@"Name"],obj.testDic[@"Name"],copyDic[@"Name"]);
[mutableDic removeObjectForKey:@"Name"];
NSLog(@"不可变Name地址是%p,copy属性的Name地址%p,strong属性的Name地址是%p, copyDic的Name的地址是%p",mutableDic[@"Name"],obj.dic[@"Name"],obj.testDic[@"Name"],copyDic[@"Name"]);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a36e3592e2e8a8bce10aac63887c3e1f.png)
- 使用strong修饰的property的容器对象地址和原可变容器对象一致,均为
0x600001949e60
,使用copy修饰的property以及copy的临时NSDictionary
容器对象都有一个新的地址 - 容器里的对象不会因为原不可变字典remove就释放掉,因为还有两处copy的,而使用strong修饰的testDic是指针拷贝,因此remove后也访问不到了
- 其他两处copy的仍可以继续访问key为@"Name"的对象