iOS NSMutableArray和NSArray实例执行mutableCopy和copy方法的区别?

2020-06-23 10:39:00 浏览数 (1)

代码语言:javascript复制
    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]));
代码语言:javascript复制
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则会只复制指针。

0 人点赞