深浅复制的定义:

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

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

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

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

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

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

  

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

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

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

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

  

 #import <Foundation/Foundation.h>

 int main(int argc , const char *argv[]){
@autoreleasepool {
NSLog(@"-------------不可变对象到不可变对象的转换-------------");
NSString *str1 = @"aaaa";
NSString *str2 = [str1 copy]; // 对于不可变对象来说,是潜复制,计数器加一,始终返回一个不可变对象
NSLog(@"str1 = %p , str2 = %p",str1,str2); // str1 和 str2 地址相同,没有生成新的字符串 NSLog(@"-------------可变对象到可变对象的转换---------------");
NSMutableString *str3 = [NSMutableString stringWithString:@"aaaa"];
NSMutableString *str4 = [str3 mutableCopy]; // copy对于可变字符串来说是深复制
NSLog(@"str3 = %p , str4 = %p",str3,str4); // str3 和 str4 地址不同,生成新的字符串 NSLog(@"-------------可变对象到不可变对象的转换---------------");
str1 = [str3 copy]; // copy 对于可变字符来说是深复制
NSLog(@"str1 = %p , str3 = %p",str1,str3); NSLog(@"-------------不可变对象到可变对象的转换---------------");
str3 = [str1 mutableCopy]; // copy 对于不可变字符串来说是浅复制
NSLog(@"str1 = %p , str3 = %p",str1,str3); }
return ;
}
 

运行结果:

  


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

 

什么时候用到深浅拷贝?

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

Objective-c 深浅复制的更多相关文章

  1. 详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy

    读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...

  2. OC-深浅复制

    [OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深 ...

  3. Python基础之列表深浅复制和列表推导式

    一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...

  4. C# 深浅复制 MemberwiseClone(转载)

    最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考MSDN:https://docs.microsoft.com/zh-cn/dotnet/api/syst ...

  5. C# 深浅复制 MemberwiseClone

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考 ...

  6. 潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)

    格式化输出和字符串转义 占位符 使用示意 作用 %s '%s %s' % ('hello', 'world') 表示占位的是str %d '%d %d' % (1, 2) 表示占位的是int %d ' ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题

    尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...

  9. Python 字符串拼接、格式化输出、深浅复制

    拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...

随机推荐

  1. poj2136---输出特殊图形

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]; int find(int pos,int ...

  2. [LeetCode][Python]Tow Sum

    # -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/two-sum/ Given an array of integers, find ...

  3. oracle任务计划debug

    crontab -eno crontab for root - using an empty onecrontab: installing new crontab"/tmp/crontab. ...

  4. python字符串转义与正则表达式特殊字符转义

    最近在自学python,字符串和正则表达式的特殊字符转义有点混淆,做个笔记简单总结一下. 1.普通字符串转义 在字符串中使用特殊字符时,要用反斜杠(\)转义字符.例如:'Let\'s go!',这里对 ...

  5. 【原】浅谈Firefox下的js、css、图片阻塞现象(一)

    外部js文件阻塞body中的图片 以如下html为例: <!DOCTYPE HTML> <html> <head> <meta http-equiv=&quo ...

  6. asp.net ToString()方法介绍

      C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToStri ...

  7. This project references NuGet package(s) that are missing on this computer.

    Install Nuget. Right click on the solution and select "Enable NuGet Package Restore". Clic ...

  8. 转载 LayoutInflater的inflate函数用法详解

    http://www.open-open.com/lib/view/open1328837587484.html LayoutInflater的inflate函数用法详解 LayoutInflater ...

  9. Jquery中的delegate()使用方法介绍

    delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数 delegate定义和用法 delegate() 方法为指定的元素(属于被选 ...

  10. python 实现单链表

    #! /usr/bin/env python ### ### Linked List python implementation ### ### @reference Data Structures ...