设为首页 加入收藏

TOP

[Objective-C] Copy 和 MutableCopy(一)
2017-10-13 10:23:51 】 浏览:8488
Tags:Objective-C Copy MutableCopy

看了几篇文章,因为文章很新手向,所以内容很繁琐。故整理一下重点,写了测试程序去了解几个知识点,不讨论基本概念。新博客wossoneri.com传送门

非集合类对象的copy与mutableCopy

      //NSString & NSMutableString
      NSString *strA = @"origin";
      NSLog(@"strA pointer: %p content: %@", strA, strA);
      
      NSString *strACopy = [strA copy];
      NSLog(@"strCopy pointer: %p content: %@", strACopy, strACopy);
      
      NSMutableString *strAMCopy = [strA mutableCopy];
      NSLog(@"strMCopy pointer: %p content: %@", strAMCopy, strAMCopy);
      
      
      NSMutableString *strB = [NSMutableString stringWithString:@"mutable string"];
      NSLog(@"strB pointer: %p content: %@", strB, strB);
      
      NSMutableString *strBCopy = [strB copy];
      NSLog(@"strBCopy pointer: %p content: %@", strBCopy, strBCopy);
      
      NSMutableString *strBMCopy = [strB mutableCopy];
      NSLog(@"strBMCopy pointer: %p content: %@", strBMCopy, strBMCopy);

//输出
strA        pointer: 0x100003180 content: origin
strCopy     pointer: 0x100003180 content: origin
strMCopy    pointer: 0x100102e90 content: origin
strB        pointer: 0x100700510 content: mutable string
strBCopy    pointer: 0x100700570 content: mutable string
strBMCopy   pointer: 0x1006002c0 content: mutable string

在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copymutableCopy都是内容复制。

结论

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

集合类对象的copy与mutableCopy

      NSArray *arrayA = @[@[@"A", @"B"], @[@"C", @"D"]];
      NSLog(@"arrayA pointer:%p contentA:%p contentB:%p", arrayA, arrayA[0], arrayA[1]);
      
      NSArray *arrCopyA = [arrayA copy];
      NSLog(@"arrCopyA pointer:%p contentA:%p contentB:%p", arrCopyA, arrCopyA[0], arrCopyA[1]);
      
      NSMutableArray *arrMCopyA = [arrayA mutableCopy];
      NSLog(@"arrMCopyA pointer:%p contentA:%p contentB:%p", arrMCopyA,arrMCopyA[0], arrMCopyA[1]);

      
      NSMutableArray *arrayB = [NSMutableArray arrayWithObjects:@[@"A", @"B"], @[@"C", @"D"], nil];
      NSLog(@"arrayB pointer:%p contentA:%p contentB:%p", arrayB, arrayB[0], arrayB[1]);
      
      NSArray *arrCopyB = [arrayB copy];
      NSLog(@"arrCopyB pointer:%p contentA:%p contentB:%p", arrCopyB, arrCopyB[0], arrCopyB[1]);
      
      NSMutableArray *arrMCopyB = [arrayB mutableCopy];
      NSLog(@"arrMCopyB pointer:%p contentA:%p contentB:%p", arrMCopyB,arrMCopyB[0], arrMCopyB[1]);
      
//输出
arrayA      pointer:0x100700860  contentA:0x100700840 contentB:0x1007007c0
arrCopyA    pointer:0x100700860  contentA:0x100700840 contentB:0x1007007c0
arrMCopyA   pointer:0x100700990  contentA:0x100700840 contentB:0x1007007c0

arrayB      pointer:0x100701970  contentA:0x100700880 contentB:0x100701730
arrCopyB    pointer:0x100102080  contentA:0x100700880 contentB:0x100701730
arrMCopyB   pointer:0x100701ab0  contentA:0x100700880 contentB:0x100701730

可以看到拷贝过程和非集合类大体相同。注意一点,就是拷贝过程只是针对对象本身,而对象内部的元素还是指针复制,从上面打印的输出就可以看出来。

示例

看如下代码,有一个mutable数组,赋值给immutable数组

@property (nonatomic, strong) NSArray *array;
  NSMutableArray *mArray = [NSMutableArray array];
  [mArray addObject:@"AA"];
  _array = mArray;
  NSLog(@"mArray: %p, _array: %p", mArray, _array);
  [mArray addObject:@"BB"];
  NSLog(
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇APP上架证书无效:解决 下一篇@property? @property?说说他身..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目