在声明一个property的时候总是搞不清什么时候用retain,什么时候用copy,用上去了感觉也不会错,但是又没有安全感;

Copy:顾名思义,复制,将对象复制一份,ios内部的操作时,先copy出一份新的对象,然后销毁旧的,新的对象引用计数为1;

retain:中文含义为保留,ios内部是,释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1;

言下之意:Copy是内容复制;retain是内存地址复制;

注意:

  例:

@property (nonatomic, copy) NSMutableArray *listArray;

当MutableArray被copy的时候,如果你实例化时的语句是:

    self.listArray = [[NSMutableArray alloc]init];

然后去给它加对象:

    [self.listArray addObject: @"墨和米说"];

这个时候运行则会报错,错误为:

-[__NSArrayI addObject:]: unrecognized selector sent to instance 0xa7446f0

按我的理解是@property 是系统内部生成setter和getter.当使用self.listArray = 的时候是利用setter给listArray赋值, 我又给这个setter方法设置了copy, 经过copy复制的listArray是一个不可变的数组(NSArray,详见官方文档), 然后我又去add,一个不可变数组显然add不进去,所以就报错了,当然这个报错就呵呵了.

如果我们用:

_listArray = [[NSMutableArray alloc]init];

则不会报错!

因为_listArray是一个变量,是在栈内存里, copy了还是指向的还是原来的可变数组,所以add显然就不会出问题!

可参考:http://blog.csdn.net/mars2639/article/details/7352540

下一期将会用一段代码来演示

什么时候用copy什么时候用retain (一)的更多相关文章

  1. NSString 为什么要使用copy,而不是retain

    NSString 为什么要使用copy,而不是retain1.首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好2.但是使用copy安全.因为NSString 为 NSMuta ...

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

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

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

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

  4. strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *stringA; @property ...

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

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

  6. IOS开发 strong,weak,retain,assign,copy nomatic 等的区别与作用

    strong,weak,retain,assign,copy nomatic 等的区别 copy与retain:1.copy其实是建立了一个相同的对象,而retain不是:2.copy是内容拷贝,re ...

  7. IOS中Retain和Copy的区别

    1 ,可读性: readonly  . readwrite@property(readwrite,....) valueType value;这个属性是变量的默认属性,就是如果你 (readwrite ...

  8. 再谈 retain,copy,mutableCopy(官方SDK,声明NSString都用copy非retain)

    之前一直以为retain就是简单的计数器+1,copy就是重新开辟内存复制对象: 其实不是这样,原来之前的自己独自徘徊于糊涂之中. (官方SDK,对NSString属性的定义都是用copy,而不是re ...

  9. NSString NSMutableString copy mutableCopy retain weak strong整合

    copy retain assign的差别在于对象属性的set方法 NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import ...

随机推荐

  1. malloc/free 和 new/delete 的区别

    1.malloc在C和C++中的区别 1.1.C中可以将任意的指针赋值给void*类型的变量.也可以将void*类型的值赋值给通常的指针变量. ---------------------------- ...

  2. 10 signs you’re dating the wrong person

    10 signs you’re dating the wrong person10个迹象表明TA不是你的真心人       Do you have any exes who were so awful ...

  3. Java科普之基础知识回顾

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! Java语言由C衍生,丢弃C中的指针,使用"发出指令-接收返回值-验证-发出指令-接收返回 ...

  4. OpenGL环境搭建Windows+Mac+Linux

    OpenGL环境搭建Windows+Mac+Linux Mac平台下 下载列表:GLFWcmake 下载的GLFW解压缩 然后安装cmake, 安装好cmake之后打开 1.browse source ...

  5. JS可改变列宽table

    <!DOCTYPE HTML> <html> <head> <meta charset="gbk"> <title>ta ...

  6. php pod

    //PDO:数据访问抽象层 //dsn:数据源: //带有事务功能: $dsn = "mysql:host=localhost;dbname=mydb"; ——建立数据源 //造p ...

  7. 【USACO】【Section1.1】Greedy Gift Givers

    小白题,也没啥好说的.关键我的算法感觉特别菜的一点是每次要遍历数组从人名找对应的编号,这个效率就很低了.看了ANALYZE里面也是这样的.不过它比我好的一点是我多余设置了initial_money变量 ...

  8. JS身份证真实性校验(二)

    var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ]; // 加权因子 var ValideCode = [ 1, 0 ...

  9. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  10. 【分享】IT产业中的三大定理(一) —— 摩尔定理(Moore's Law)

    科技行业流传着很多关于比尔·盖茨的故事,其中一个是他和通用汽车公司老板之间的对话.盖茨说,如果汽车工业能够像计算机领域一样发展,那么今天,买一辆汽车只需要 25 美元,一升汽油能跑四百公里.通用汽车老 ...