设为首页 加入收藏

TOP

Objective-c 深浅复制
2017-10-12 18:17:05 】 浏览:9056
Tags:Objective-c 深浅 复制

  深浅复制的定义:

  浅复制:在复制时,对于被复制对象的每一层都是指针复制。

  深复制:在复制时,对于被复制的对象至少有一层是对象复制。

  完全复制:在复制时,对于被复制对象的每一层都是完全复制。

 

  retain: 始终是潜复制,引用计数器每次加一,返回对像是否可变与被复制对象保持一致。

  copy: 对于可变对象是深复制,引用计数不改变。对于不可变对象是浅复制,引用对象每次加一,始终返回一个不可变对象。

  MutableCopy: 始终是深复制,引用计数不改变,始终返回一个可变对象。

  

  不可变对象:值发生改变,其内存首地址随之改变。

  可变对象: 无论值发生改变,其内存首地址都不会发生改变。

  引用计数:为了让使用者知道,该对象有多少个拥有者。

 

  下面通过一个程序来具体展现它的用法:

  

 1 #import <Foundation/Foundation.h>
 2 
 3 int main(int argc , const char *argv[]){
 4     @autoreleasepool {
 5         NSLog(@"-------------不可变对象到不可变对象的转换-------------");
 6         NSString *str1 = @"aaaa";
 7         NSString *str2 = [str1 copy];    // 对于不可变对象来说,是潜复制,计数器加一,始终返回一个不可变对象
 8         NSLog(@"str1 = %p , str2 = %p",str1,str2);  // str1 和 str2 地址相同,没有生成新的字符串
 9         
10         NSLog(@"-------------可变对象到可变对象的转换---------------");
11         NSMutableString *str3 = [NSMutableString stringWithString:@"aaaa"];
12         NSMutableString *str4 = [str3 mutableCopy];   // copy对于可变字符串来说是深复制
13         NSLog(@"str3 = %p , str4 = %p",str3,str4);   //  str3 和 str4 地址不同,生成新的字符串
14         
15         NSLog(@"-------------可变对象到不可变对象的转换---------------");
16         str1 = [str3 copy];  //  copy 对于可变字符来说是深复制
17         NSLog(@"str1 = %p , str3 = %p",str1,str3);
18         
19         NSLog(@"-------------不可变对象到可变对象的转换---------------");
20         str3 = [str1 mutableCopy];  // copy 对于不可变字符串来说是浅复制
21         NSLog(@"str1 = %p , str3 = %p",str1,str3);
22         
23     }
24     return 0;
25 }

 

 

 

 

   

运行结果:

  

 
  

2016-03-12 17:16:21.062 test[2349:183297] -------------不可变对象到不可变对象的转换-------------

 
  

2016-03-12 17:16:21.063 test[2349:183297] str1 = 0x100001070 , str2 = 0x100001070

 
  

2016-03-12 17:16:21.064 test[2349:183297] -------------可变对象到可变对象的转换---------------

 
  

2016-03-12 17:16:21.064 test[2349:183297] str3 = 0x100200210 , str4 = 0x1002003d0

 
  

2016-03-12 17:16:21.064 test[2349:183297] -------------可变对象到不可变对象的转换---------------

 
  

2016-03-12 17:16:21.064 test[2349:183297] str1 = 0x6161616145 , str3 = 0x100200210

 
  

2016-03-12 17:16:21.064 test[2349:183297] -------------不可变对象到可变对象的转换---------------

 
  

2016-03-12 17:16:21.065 test[2349:183297] str1 = 0x6161616145 , str3 = 0x1002002d0

 

 

什么时候用到深浅拷贝?

  深拷贝是在要将一个对象从可变(不可变)转化为不可变(可变)或者将一份内容克隆一份时用到的。浅拷贝是在要复制一个对象的指针时用到的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇1014-34-首页15-计算原创微博的fr.. 下一篇iOS— UIScrollView和 UIPageCont..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目