iOS Copy & MutableCopy

该文章属笔者原创, 未经允许, 禁止转载

OC中, 实现 NSCopyingNSMutableCopying 协议, 可以使用 copymutableCopy 方法

有这么一种说法, 简单的说明了 copymutableCopy 的差别

  • copy 叫做 浅拷贝, 亦叫做 指针拷贝
  • mutableCopy 叫做 深拷贝, 亦叫做 值拷贝

常见的能够进行拷贝操作的对象有 NSString/NSArray/NSDictionary

用几句话总结:

  • copy 得到的是不可变对象
  • mutableCopy 得到的是可变对象
  • 原对象 是不可变对象, 进行 copy 操作, 得到的新对象也是不可变的, 所以完全没有必要再创建一个完全一样的新对象, 只需要拷贝指针, 让 原对象新对象 都指向同一块内存地址就好
  • 原对象 是不可变对象, 进行 mutableCopy 操作, 得到的新对象是可变的, 这时候, 就需要创建一个新的对象, 并开辟一块新的内存空间, 这样才能保证就对象不可变, 新对象可变
  • 原对象 是可变对象, 无论进行 copy 还是 mutableCopy 操作, 都会重新开辟内存你空间, 创建出一个完全新的对象

验证:

NSArray *array = @[@"1", @"2"];
NSArray *newArray = [array copy];
NSMutableArray *mutableArray = [array mutableCopy];
    
NSLog(@"%p %p %p", array, newArray, mutableArray);
    
NSMutableArray *mutableArray2 = [@[@"1", @"2"] mutableCopy];
NSArray *array2 = [mutableArray2 copy];
NSArray *newArray2 = [mutableArray2 mutableCopy];
    
NSLog(@"%p %p %p", mutableArray2, array2, newArray2);

输出结果:

打印结果

用一张表来总结:

原对象 copy mutableCopy
不可变 指针拷贝 值拷贝
可变 值拷贝 值拷贝

显而易见, 并不是简单的 copy 就是 指针拷贝, mutableCopy 就是 值拷贝, 还要看原操作对象是否可变, 如果是不可变的, 那么是成立的, 当原操作对象是可变对象的时候, 无论进行什么操作, 那么结果就都是 值拷贝

注意

上述内容只针对正常情况, 因为像 NSString 等一些简单的类型, 系统采用一种叫做 Tagged Pointer 的技术, 会使结果在某些情况下有些许不一样. 了解 Tagged Pointer 相关内容后, 能更清楚的了解哪些情况下不生效

你可能感兴趣的:(iOS Copy & MutableCopy)