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. POJ 3074 Sudoku (DLX)

    Sudoku Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  2. Windows 8.1 归档 —— Step 1 选择与安装

    下面是 Windows 8.1 各版本区别: Windows 8.1 标准版(一般就称之为Windows 8.1): 包括全新的 Windows 商店.Windows 资源管理器.任务管理器等等,还将 ...

  3. 关于VIM统计命令

    都是冒号命令哈::%s/./&/gn        统计字符数:%s/\i\+/&/gn    统计单词数:%s/^//n           统计行数:%s/keyword/& ...

  4. AngularJS学习手册

    看书和视频结合是学习的最高效方式,看了这本书之后对angularjs才算是有一定的理解了.这本书以搭建一个博客为线索讲解了angularjs的知识点和实际项目开发流程.非常适合初学者!下面是我的读书笔 ...

  5. Redis 命令 - Server

    BGREWRITEAOF Asynchronously rewrite the append-only file BGSAVE Asynchronously save the dataset to d ...

  6. 【AngularJs】---实现select的ng-options

    controller .controller('MainController', function($scope, $http, $ionicModal, $timeout) { var post = ...

  7. C#数组比较取值

    string strs = string.Empty;            string[] strArray1 = { "a", "b", "c& ...

  8. UML——综合实例

  9. Android获取屏幕宽度的4种方法

    方法一: WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); int width = w ...

  10. Ubuntu 设定壁纸自动切换的shell脚本

    升级到Ubuntu14.04后,感觉bug的确比12.04少多了.顶部任务栏支持半透明效果,所以整个桌面也看上去漂亮了很多.这样的桌面也是值得瞎捣鼓一下的,想到换壁纸,但是没找到设定动态更换壁纸的选项 ...