NSMutableArray *arrM = [NSMutableArray arrayWithArray:@[@1,@2]];
id cp1 = [arrM mutableCopy];
id cp2 = [arrM copy];
NSLog(@"arrM %p, class %@", arrM, NSStringFromClass([arrM class]));
NSLog(@"cp1 %p, class %@", cp1, NSStringFromClass([cp1 class]));
NSLog(@"cp2 %p, class %@", cp2, NSStringFromClass([cp2 class]));
NSArray *arrI = @[@1,@2];
id cp3 = [arrI mutableCopy];
id cp4 = [arrI copy];
NSLog(@"arrI %p, class %@", arrI, NSStringFromClass([arrI class]));
NSLog(@"cp3 %p, class %@", cp3, NSStringFromClass([cp3 class]));
NSLog(@"cp4 %p, class %@", cp4, NSStringFromClass([cp4 class]));
2020-06-19 15:59:06.153599+0800 Test[81342:2338254] arrM 0x600000c73090, class __NSArrayM
2020-06-19 15:59:06.153669+0800 Test[81342:2338254] cp1 0x600000c73030, class __NSArrayM
2020-06-19 15:59:06.153701+0800 Test[81342:2338254] cp2 0x600000245660, class __NSArrayI
2020-06-19 15:59:06.153739+0800 Test[81342:2338254] arrI 0x600000245680, class __NSArrayI
2020-06-19 15:59:06.153773+0800 Test[81342:2338254] cp3 0x600000c72fd0, class __NSArrayM
2020-06-19 15:59:06.153809+0800 Test[81342:2338254] cp4 0x600000245680, class __NSArrayI
上面的问题分两种情况:
- 当可变对象mutablecopy和copy之后,都会生成新的对象,只是新的对象的类型一个是可变的一个是不可变的。
- 当不可变对象mutablecopy和copy之后,只有mutablecopy会生成新的对象,copy则会只复制指针。