1、无论是深复制还是浅复制,被复制的对象类型是不变的。此对象类型具有什么功能就具有什么功能,不会因为自行修改了返回对象的指针类型而改变。
 
比如:
这里的str和str1的值和指针地址完全一样,因为是不可变类型使用了copy,什么都不变。为什么NSNumber类型的指针可以指向NSSring类型copy出的对象呢?因为copy返回类型为id万能指针类型。如果返回的是instancetype就会警告。
记住:对于不可变的临时变量使用浅复制copy没什么用,地址和值都一样。
 
2、怎么理解最后一句话?
临时变量是方法或者函数体里面声明的一个变量,比如读取plist文件到一个可变的NSMutableArray类型的arrayM,这个arrayM就是一个可变的临时变量。当数据组织完成后需要赋值给类的成员变量,比如有个不可变的NSArray类型的array,这个array就是一个不可变的成员变量,下面这样做比较安全:self.array = [arrayM copy];
 
另外,如果这个成员变量是NSString的话,在使用set方法的时候要用copy
 
上面说的都是OC的基本对象类型的深复制和浅复制。
==============================================
下面说一下自定义OC类对象及其子类对象的深复制和浅复制
比如一个Person类,及其子类Student
1、父类遵循<NSCoping>协议
2、父类实现copyWithZone:方法
3、子类Student继承父类Person,自动继承了<NSCopying>协议
4、子类Student重写父类的copyWithZone:方法
 
*********************************************************************
问题一:
如果父类的[self class]换成了父类Person本身类型会有什么问题?
上面说过虽然copy的返回值类型是id类型的,任何类型的指针都可以指向copy堆中后的对象,但不具有什么功能方法始终不具备什么功能方法。这里虽然Student类型的指针s1指向了Person的copy后的对象,但Person的copyWithZone:方法是Person类自身的复制,所以s1指针的Person类型的对象,而Person类没有No成员变量,所以会找不到方法。报如下常见错误:
 
问题二:
如果在copyWithZone:中少写了某个或某些成员变量的赋值,会有什么结果?
结果就是未被赋值的成员变量将保持该成员变量类型的默认值。比如,Person里面少赋值了一个age成员变量,Student对象在copy的时候访问age变量得到的值为0,而不是1000.如上图调试所示。
 
////////////////////////////////////////////////////////////////////////
另:iOS里的[self class]就等同于C#中的T

iOS 深复制&浅复制的更多相关文章

  1. 简单理解php深复制浅复制问题

    其实接触深复制浅复制是通过学习c++了解到的,比如c++很好用的模板,php是不允许方法模板和类模板 一个简单的例子,如果不是很了解php 的取地址符&,可以去看下官方文档,php的& ...

  2. iOS开发之Copy & MutableCopy及深复制 & 浅复制

    1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...

  3. C++类四个默认函数&深复制&浅复制

    学习C++语言的同学都知道,C++中类是有默认的几个函数的,主要是有四个函数: 四个函数 默认构造函数:A(void),无参构造函数 拷贝(复制)构造函数:A(const A&a).用一个对象 ...

  4. java 及 Jquery中的深复制 浅复制

    发现问题:最近 遇到由于复制对象之后,改变复制后的新变量,原先被复制的对象居然会跟着变. EX:java中: //holidayConfig.getEnd_time()会随着sTime的改变而改变 s ...

  5. Python深复制浅复制or深拷贝浅拷贝

    1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...

  6. iOS中的深复制与浅复制

    很多语言中都有深复制浅复制的概念,如C++,ObjC等.简单来说,浅复制就是两个变量指向了同一块内存区域,深复制就是两个变量指向了不同的内存区域,但是两个内存区域里面的内容是一样的. 浅复制示意图: ...

  7. python中深复制与浅复制

    转载:http://blog.csdn.net/vicken520/article/details/8227524 java中也经常碰见这种问题.时间原因就不写java方面啦 Python深复制浅复制 ...

  8. Java中的浅复制和深复制 Cloneable clone

    先看一个简单案例 public class Test {     public static void main(String args[]) {         Student stu1 = new ...

  9. [Python]Python中的浅复制与深复制

    看python的文档,发现list有copy方法,描述说效果同a[:]. 感觉有点惊讶,之前一直以为a[:]执行的是深复制. test了一下,发现确实如果a中存在可变对象,如list/set/dict ...

随机推荐

  1. [改善Java代码]建议采用的顺序是 List<T>、List<?>、List<Object>

    建议98:建议采用的顺序是 List<T>.List<?>.List<Object> List<T>.List<?>.List<Obj ...

  2. [改善Java代码]break万万不可忘

    建议15:break万万不可忘 public class Client { public static void main(String[] args) { System.out.println(&q ...

  3. U-boot新手入门

    U-boot新手入门 一.编译U-boot 二.U-boot命令详解 1.帮助命令 # help autoscr -run script from memory base -print or set ...

  4. VS中的波浪线

    绿色波浪线: 如果你的代码中出现了绿色的波浪线,说明你的代码语法并没有错误, 只不过提示你有可能会出现错误,但是不一定会出现错误.警告线 红色波浪线: 如果你的代码中出现了红色的波浪线,意味着你的代码 ...

  5. sublime安装 less环境

    工具的选择: mac-codekit simpless->跨平台 winless-windows  less.js下载:http://pan.baidu.com/s/1o60yTZ0   安装L ...

  6. Linux 命令 - df: 报告磁盘空间的占用情况

    df 命令列出指定的文件名所在的文件系统上可用磁盘空间的数量. 如果没有指定文件名,则显示当前所有使用中的文件系统.默认情况下,磁盘空间以 1K 为一块显示,如果设置了环境变量 POSIXLY_COR ...

  7. HDOJ2020绝对值排序

    绝对值排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  8. 老男孩-金角大王-python学习博客地址

    http://www.cnblogs.com/alex3714/category/770733.html

  9. Javascript之计时

    // <!DOCTYPE html> <meta http-equiv="Content-Type" content="text/html; chars ...

  10. 利用js来实现一些常用的算法

    示例代码中的arr指的是给出的数组,s指的是数组的起始坐标0,end指的是数组的最后一个坐标arr.length-1,n指的是要查找的数字 查找某个值: 1.线性法 function findInAr ...