欢迎来到天天文库
浏览记录
ID:20030866
大小:64.00 KB
页数:5页
时间:2018-10-09
《详细讲述在采用引用计数的内存回收方式的工作原理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、一、Objective-C的内存回收机制在Objective-C中采用的是引用计数的内存回收方式。凡是继承NSObject的类生成的对象,当对象的计数为0,会对对象执行dealloc并回收。 二、alloc,retain,release1、alloc:用来分配内存,在利用alloc生成分配了一个对象内存后,该对象的引用计数是1。 如:ClassA *obj = [[ClassA alloc] init]; //retainCount 为1 2、release:用来将对象的引用计数减一,当我们不在需要这个对象调用obj的release方法使引用计数变为0
2、,obj的dealloc方法会被自动调用。 接上例:[obj release]; //retainCount 减一变为0,obj的dealloc会被调用 3、retain:用来将对象的引用计数加一。 如:ClassA *obj = [[ClassA alloc] init]; //retainCount 为1[obj retain]; //retainCount为2//do something[obj release]; //retainC
3、ount为1[obj release]; //retainCount为0,调用dealloc 对象释放 在这个环节上容易出的错误:ClassA *obj1 = [[ClassA alloc] init]; //ClassA里面有个 名为hello的functionClassA *obj2 = obj1;//do something with obj1 and obj2[obj1 hello];[obj1 release]; //对象已经释放掉了 [obj2 hello];
4、 //崩溃,obj2已经是野指针了[obj2 release]; 三、autorelease,NSAutoreleasePool和工厂方法 1、NSAutoreleasePool:在开发的过程中会出现内存申请者经常会出现内存申请者和内存使用者之间的交互问题,比如,一个函数内部申请了内存,做了一些操作,然后返回这块内存。这个时候调用者要负责对这块内存执行清理工作,在调用栈很深的情况下,很容易产生内存泄露。而且这种内存解决方案破坏了内存由谁生成由谁释放的原则。 为了解决这个问题,产生了NSAutorelea
5、sePool。使用方法如下: NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; //创建一个release poolClassA *obj = [[[http://www.cp061.comalloc] init] autorelease]; //创建一个对象并将它加入release pool[obj retainCount]; //retainCount为1//do something[pool release]; //在release pool
6、被释放的时候将obj的引用计数自动减一,这时 //obj的releaseCount变为了0,obj被释放 对象在被autorelease时他的引用计数并没有立即减少,而是在releasepool被释放的时候引用计数才减一的。在对象被 2、工厂方法:在UIKit提供的类中经常会看到static方法创建出的对象,如:NSNumber *numObj = [NSNumber numberWithInt: 1]; 从设计模式的角度上讲这个static方法创建了,一个对象,这中利用公共方法创建
7、对象的模式叫做工厂方法。 在Objective-C中的程序设计中有个规则,就是这种工厂方法返回的对象都是不需要调用者release的,因为虽然他们现在的引用计数为1,但是他会自动释放。(因为他们在返回对象的时候都对其调用了autorelease) 3、深入讲解NSAutoreleasePool NSAutoreleasePool是苹果公司实现的类,我们无法知道他是怎么实现的,但是可以确定的是,在对象调用autorelease的时候,距离对象最近的NSAutoreleasePool将记录该对象,并在a
此文档下载收益归作者所有