Objective-C - retain release autorelease assign copy

来源:互联网 发布:图纸画图软件 编辑:程序博客网 时间:2024/04/28 00:13

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为1Test *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是内容拷贝。哇,比想象的简单多了… 



原创粉丝点击