http://examples.oreilly.com/9780596809775/ObjC.pdf
转载地址:http://blog.csdn.net/jiarusun000/article/details/6991249
Objective-C - retain release autorelease
Objective-C在管理内存时,遵循一套简单的规则。
每一个对象都有一个名为"retainCount"的变量,它表示该对象有多少个引用。
class *obj = [class alloc];//alloc会导致retainCount为1
[obj retain];//retainCount++ 通常在对象赋值之后这样做,代表它多了一个引用。
[obj release];//retainCount-- 通常在使用完该对象的时候这样做。
当 retainCount为0时,运行时环境会通过调用[obj dealloc]来释放对象占用的内存。
下面 看一个例子:
Test *t1 = [[Test alloc] initWithNum:12];//创建了一个对象,t1是该对象的引用,由于调用了alloc此时retainCount为1
Test *t2 = t1;//此时t2也要使用该对象
[t2 retain];//t2要使用对象 就必须要retain,此时retainCount为2
[t1 release];//t1这时不用该对象了 就release了,也就是放弃了对象的使用权,此时retainCount为1
[t2 release];//t2使用完了 就release 此时retainCount为0,立刻会调用dealloc来释放内存
其实,规则很简单。谁使用谁就先retain,用完在release就可以了。这样就不会内存泄露了。
oc中存在一个autorelease pool,其实它是一个NSMutableArray。
把对象加入到autorelease pool:
[obj autorelease];
autorelease在释放的时候会给所有的对象发送release,如果该对象的retainCount为1,那么结果导致 retainCount为0,然后运行时就会调用对象的dealloc,以此来实现内存释放。
如果你
[obj retain];
之后没有
[obj release];
在autorelease pool 释放的时候一样会内存泄露!记住autorelease pool只是给对象发送一次release而已!
转载地址:http://blog.csdn.net/zhangao0086/article/details/6674460
Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)
官方文档地址:http://disanji.net/iOS_Doc/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html
assign:指定setter方法用简单的赋值,这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。
retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息。你可以想象一个NSString实例,它是一个对象,而且你可能想要retain它。
copy:指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。
readonly:将只生成getter方法而不生成setter方法(getter方法没有get前缀)。
readwrite:默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。
atomic:对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。
nonatomic:不保证setter/getter的原子性,多线程情况下数据可能会有问题。
object c 中 retain 和copy的区别
转载地址:http://www.cnblogs.com/luyinghuai/archive/2011/01/27/1945948.html
原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?
assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。
Retain vs. Copy!!
copy: 建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
那上面的是什么该死的意思呢?
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…