1 深复制:内容拷贝,源对象和副本对象指的是两个不同的对象,源对象引用计数器不变,副本对象引用计数器为1

2 浅复制:指针拷贝,源对象和副本对象指的都是同一个对象,对象引用计数器+1,相当于retain

3 只有不可变对象创建不可变副本(copy)才是浅复制,其它的都是深复制

copy关键字的使用

平时我们使用对象之间的传值都是采用retain count +1的方式,这种方式的适用于当对象的某属性的值改变时,引用该对象的不同指针会同时改变,因为这两个指针指向的是同一个内存地址,

但如果需求是,当一个指针执行的对象属性值发生改变时,不影响另一个对象,那么需要分配两个不同的内存地址,也就是说,我们就不可以采用retain关键字了,而是要采用copy 关键字,因为copy关键字会在复制时重新创建一个新的对象。 举例说明一下copy使用

这里创建一个Person类

Person.h,代码:

@interface Person : NSObject <NSCopying>{

NSString *name;

NSString  *email;

}

@property (nonatomic, retain) NSString *name;

@property (nonatomic,retain)NSString *email;

@end

Person.m文件

#import “Person.h”

@synthesize name,email;

- (id)initWithName:(NSString *)theName andEmail:(NSString *)theEmail

{

self = [super init];

if (self){

self.name = theName;

self.email = theEmail;

}

}

- (id)copyWithZone:(NSZone *)zone

{

Person *aPerson = [[Person allocWithZone:zone] initWithName:[self name] andEmail:[self email]];

return aPerson;

}

- (void)delloc

{

[name release];

[email release];

[super dealloc];

}

这里说明一下,

在对象之间copy,首先需要类是继承自NSObject,其次需要实现<NSCoding>协议,最后在方法中实现

- (id)copyWithZone:(NSZone *)zone 方法

如果没有此方法那么在copy对象,程序会直接宕机,并提示Person类找不到copyWithZone方法。

这里还有一点需要注意的是,通常在NSArray之间copy,是retain方式的复制,也就是直接将引用系数+1,

如下 代码:

NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];

NSMutableArray *array2 = [array1  copy]; 或使用

NSMutableArray *array2 =[ [NSMutableArray alloc] initWithArray:array1];

如果想使用两个不同内存,那么就需要使用到NSArray 的deep copy,例如:

NSArray *array1 = [[NSArray alloc] initWithObjects:person1,person2,person3,nil];

NSMutableArray *array2 = [[NSMutableArray alloc] initWithArray:array1 copyItems:YES];

iOS copy/retain/assign的更多相关文章

  1. IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic、 @synthesize、@property、@dynamic

    IOS 关键字self,super,copy, retain, assign , readonly , readwrite, nonatomic.                     @synth ...

  2. copy,retain,assign,strong,weak的区别

    引用地址:http://www.aichengxu.com/view/32930 一.assign,copy,retain 1.copy是内容复制,新建一个相同内容的不同指针,retain为指针复制, ...

  3. iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

    依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...

  4. copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议 ...

  5. COPY, RETAIN, ASSIGN , READONLY , READWRITE,STRONG,WEAK,NONATOMIC整理--转

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString 对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协 ...

  6. OC weak strong __weak __strong copy retain assign nonatomic atomic等关键字的总结

    weak和strong的区别: weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它. 一旦最后一个strong型指针离去 ...

  7. iOS开发知识点:理解assign,copy,retain变strong

    一..h和.m文件的变化说明 1.对于.h头文件,主要是将属性定义由retain变为strong @property (retain, nonatomic) 变为 @property (strong, ...

  8. iOS property中的strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

    iOS5中加入了新知识,就是ARC,其实我并不是很喜欢它,因为习惯了自己管理内存.但是学习还是很有必要的. 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都 ...

  9. 理解assign,copy,retain变strong

    举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一 ...

随机推荐

  1. 读取编码器信息Python2.7和Python3.3版本差异及解决,一次订阅多次调用callback的解决

    1. Python3.3以字节类型返回编码器信息,b'...',BUF: b'\xc3KOO\x00OO\x00OO\x00OO\x00OO\x00\x03\x00\x00\x00\x00\x99R\ ...

  2. python和linux的环境设置/PATH

    一.python的环境设置 1.输出path列表: pi@raspberrypi:~$ pythonPython 3.4.0 (default, Jul 1 2014, 09:37:01) [GCC ...

  3. Leetcode 数组问题:删除排序数组内的重复项

    问题描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  4. Oracle ORA-01033: ORACLE initialization or shutdown in progress

    先说明,我出现此错误的原因是:我手动通过drop语句删除表空间,结果磁盘中文件还存在,然后我手动删除了文件,重启了oracle服务,再去连接oracle时就出现了这个错误. 网上也有“连接Oracle ...

  5. oracle内核学习总结

    http://blog.csdn.net/bcbobo21cn/article/category/3092145/1

  6. Angular 组件通讯、生命周期钩子 小结

    本文为原创,转载请注明出处: cnzt       文章:cnzt-p http://www.cnblogs.com/zt-blog/p/7986858.html http://www.cnblogs ...

  7. android_checkbox_dialog 设计 是不是要开起 默认不提示对话框

    android_checkbox_dialog设计是不是开起默认不提示 package com.example.android_checkbox_dialog; import android.app. ...

  8. Java经常使用类及其经常用法

    1.ArrayList java.util.ArrayList<E> add(E e) //插入尾部 add(int index, E element) remove(int index) ...

  9. linux led子系统(二)

    对于led子系统中,有那么多得trigger,下面就来简单了解下. 1.default-on static void defon_trig_activate(struct led_classdev * ...

  10. [网页游戏开发]Morn组件赋值

    在讲解List之前,我们先介绍一下Morn组件赋值功能 默认属性赋值 界面逻辑开发过程中,经常会涉及到动态更改UI属性,比如: 界面有一个按钮,一个多选框和一个文本,分别命名为myButton,myC ...