copy语法的目的:改变副本的时候,不会影响到源对象: 深拷贝:内容拷贝,会产生新的对象.新对象计数器置为1,源对象计数器不变. 浅拷贝:指针拷贝,不会产生新的对象.源对象计数器+1. 拷贝有下面两个方法实现拷贝: - (id)copy; - (id)mutableCopy; 对象要实现copy,必须实现<NSCopying>协议数组,字典,字符串都已经实现了<NSCopying>协议,以下以字符串为例: 1.不可变字符串调用copy实现拷(浅拷贝) NSString *strin…
1.列表拷贝 引用是指保存的值为对象的地址.在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些.下面举个例子: 问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制 a=[1,2]b=a 这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象.这样,如果对a或b的元素进行修改,a,b的值同时发生变化. 解决的方法为: a=[1,2]b=a[:] 这样修改a对b没有影响.修改b对a没有影响. 但 这种方法只适…
来点鸡汤: // 所谓拷贝 就是在原有的对象的基础上产生一个新的副本对象.有两点原则: //   1. 改变原对象的属性和行为不会影响副本对象 //   2. 改变副本对象的属性和行为不会影响原对象 来段示例代码 - (void)viewDidLoad {     [super viewDidLoad]; /##########################################/     // 以NSArray 为例    /############################…
如果持久话自定义对象 那么这个对象一定要遵循 NSCoding 协议 并实现编解码:然后再将编解码后的数据 NSKeyedArchiver 到NSData中   @interface NSKeyAndValue : NSObject <NSCoding> // 键值对象 @property (nonatomic, retain) NSString* m_strKey; @property (nonatomic, retain) NSString* m_strValue; @property (…
浅拷贝:浅拷贝并不拷贝对象本身,只是对指向对象的指针进行拷贝深拷贝:直接拷贝对象到内存中一块区域,然后把新对象的指针指向这块内存 在iOS中并不是所有对象都支持Copy和MutableCopy,遵循NSCopying协议的类可以发送Copy协议,遵循NSMutableCopying协议的类可以发送MutableCopy消息.如果一个对象没有遵循这两个协议而发送Copy或者MutableCopy消息那么会发生异常.如果要遵循NSCopying协议,那么必须实现copyWithZone方法.如果要遵…
copy语法的目的:改变副本的时候,不会影响到源对象: 深拷贝:内容拷贝,会产生新的对象.新对象计数器置为1,源对象计数器不变. 浅拷贝:指针拷贝,不会产生新的对象.源对象计数器+1. 拷贝有下面两个方法实现拷贝: - (id)copy; - (id)mutableCopy; 要实现copy,必须实现<NSCopying>协议数组,字典,字符串都已经实现了<NSCopying>协议,以下以字符串为例,其他的同理: 1.不可变字符串调用copy实现拷(浅拷贝) NSString *s…
在开发过程中我们经常会遇到对象拷贝的问题,下面我们分别讨论赋值操作.对象拷贝.以及浅拷贝(Shallow copy)与深拷贝(Deep copy)的区别与各自的实现方式. 一.不同对象的赋值操作 Objective-C中有两类对象,一类是结构体(或者基本数据类型也算),另一类是NSObject对象. 对于结构体,代码直接会操作其实体,因此赋值操作会创建一个源对象的副本(一个新的对象):而对于NSObject对象,必 须使用指针来操作对象,所以其赋值操作相当于复制了指针,而非对象,也就是说赋值操作…
一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h> - (id)copyWithZone:(NSZone *)zone { id obj = [[[self class] allocWithZone:zone] init]; Class class = [self class]; while (class != [NSObject class]) {…
什么是深拷贝和浅拷贝 浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象.至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的. 如果是 strong类型,那么被拷贝的对象的内存计数值会+1,如果赋值给了weak类型的变量,那么被拷贝的对象的内存计数值会保持不便. 深拷贝:将内存中的对象拷贝一份,放到一个新的位置,并将这个指向这个新位置的指针指赋值给另外一个变量. 判断拷贝类型,关键的依据是指针所指向的对象在内存中的地址. IOS…
对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. <iostream> using namespace std; class CExample { private:      int a; public:      CExample(int b)      { a=b;}      void Show ()      {         cout…