好程序员特训营学习笔记ios内存问题_第1页
好程序员特训营学习笔记ios内存问题_第2页
好程序员特训营学习笔记ios内存问题_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、百度文库让每个人平竽地捉升口我Objective-C 提供了三种内存管理方式:manual retain-release (MRR,手动管理),automatic reference counting (ARC,自动引用计数),garbage collection (垃圾回收)。iOS 不支持垃圾 回收;ARC作为苹果新捉供的技术,苹果推荐开发者使用ARC技术来管理内存;这篇笔记主要 讲的是手动管理。内存管理的目的是:匸不要释放或者覆盖还在使用的内存,这会引起程序崩溃:2释放不再使用的内存,防止内存池露。iOS程序的内存资源是宝贵的。MRR手动管理内存也是基于引用计数的,只是需要开发者发消息给

2、某块内存(或者说是对象) 来改变这块内存的引用计数以实现内存管理(ARC技术则是编译器代替开发者完成相应的匚作)。块内存如果计数是零,也就是没有使用考(owner),那么objective-C的运行环境会向动回收 这块内存。objective-C的内存管理遵守下面这个简单的策略:注:文档中把引用计数加1的操作称为拥有(own,或# take ownership of)某块对象/内存; 把引用计数减1的操作称为放弃(relinquish)这块对象/内存。拥有对象时,你可以放心地读写 或者返回对象:当对象彼所有人放弃时,objective-C的运行环境会回收这个对象。你拥有你创建的对象也就是说创建

3、的对象(使用alloc, new, copy或者mutalbeCopy等方法)的初始引用计数是仁2-给对象发送retain消息后,你拥有了这个对象3.当你不需要使用该对象时,发送release或者autorelease消息放弃这个对象4不要对你不拥有的对象发送放弃”的消息注:简单的賦值不会拥有某个对象。比如:NSString *name =;上而这个賦值操作不会拥有这个对象(这仅仅是个指针赋值操作);这和C+语言里的某些基于 引用计数的类的行为是有区别的。想拥有个objective-C对象,必须发送创建或者retain消 息给该对象。dealloc 方法dealloc方法用来释放这个对象所占的

4、内存(包括成员变量)和其它资源。不要使用dealloc /法来管理稀缺资源,比如文件,网络链接等。因为由于bug或者程序意外退 出,dealloc方法不能保证定会被调用。Accessor Methods和内存管理Accessor Methods.也就是对象的property (属性)的getter和setter方法。显然,如果getter 返回的对象已经彼运行环境回收了,那么这个getter的返回值是毫无意义的。这就需要在setter 方法里拥有”相应的propertyo比如:interface Counter: NSObjectproperty (nonatomic, retain) NSN

5、umber *count;endgetter方法仅仅返回成员变虽就可以:-(NSNumbercount retur n _count;setter方法需要保证对这个成员变量的鋼用有”: -(void)setCount 戈NSNumber *)newCount newCount retain;NSNumber *zero 二NSNumber alloc initWithlnteger:O);self setC oun t:zero;zero release);以下是种可能引发错误的,偷懒的使用方式:NSNumber *zero = NSNumber alloc initWithlnteger:O

6、);Lcount release;_count = zero;.不要在初始化方法(Initializer)和dealloc方法里使用Accessor Methods不要在初始化方法里使用accessor methods的原因可能是(原文档中没有说明):在初始化方 法里,成员变量处于最初的状态,并没有任何值。考虑到个成员变量的setter方法般会对成 员变量的I口值发送release消息。这种行为在初始化方法里没有意义。如果需要在Initializer里给成员变量赋值,可参见开始捉到的原始文档里给出的示例代码。使用 weak reference (费引用)来避免 retain cycle对个对象

7、发送retain消息会创建对这个对象的强引用(strong reference)如果两个对象都有 个强引用指向对方,那么就形成了 个环(retain cycle)。这个环使得这两个对象都不可能波 releasec弱引用(weak reference)指的是种non-owning (非拥有)的关系,比如简单指针赋值关系。 使用弱引用避免了 retain cycle.但是需要注意的是,弱引用不能保证弱引用指向的对象是否存 在,所以发消息给这个对象时定要小心。如果弱引用指向的对象已经释放,那么发送消息给它 会导致程序崩溃。所以,需要点点额外的操作来使用弱引用所指的对象。比如,当向notificati

8、on center注册个对象时,notification center保存了 个指向这个对象的弱引用。当这个对象彼 回收时,需要通知下notification center。当你使用对象时,要确保这个对象不会彼回收。主要要注总以下两种情形:仁当个对象从collection对象(collection指的数组之类的集合)移除时,如果这个仅彼collection 对象拥有,那么移除操作了会彼即可回收。所以如果耍使用这个将要移除的对象,要先retaino2.当农对象回收时。这和情形1类似。Autorelease PoolAutorelease Pool可以延后发送release消息给个对象发送个aut

9、orelease消息给个对 象,和当于说这个对象在“淀时期”内都有效,“淀时期”后再release这个对象。Autorelease Pool 几个要点:autorelease pool 是个 NSAutoreleasePool 对象。一程序里的所有autorelease pool是以核(stack)的形式组织的。新创建的pool位于栈的最顶 端。当发送autorelease消息给个对象时,这个对象彼加到栈顶的那个pool中。发送drain给-个pool时,这个pool里所有对象都会受到release消息,而且如果这个pool不是位于栈顶, 那么位于这个pool上端的所有pool也会受到drai

10、n消息。一-个对象被加到-个pool很多次,只要多次发送autorelease消息给这个对象就可以:同时, 当这个pool被回收时,这个对象也会收到同样多次release消息。简单地可以认为接收 autorelease消息等同于:接收个retain消息,同时加入到个pool里:这个pool用来存放 这些暂缓回收的对象:口这个pool被回收(drain),那么pool里面的对象会收到同样次数的 release 消息。-UlKit框架己经帮你自动创建个autorelease pooL人部分时候,你可以直接使用这个pool, 不必H己创建:所以你给个对象发送autorelease消息,那么这个对象会加到这个UlKit冋动 创建的pool里。某些时候,可能需要创建个pool:没有使用UlKit框架或者其它内含autorelease pool的框架,那么妥使用pool,就妥自己创建。2如果个循环体要创建人虽的临时变量,那么创建自己的pool可以减少程序占用的内存峰值。 (如果使用U

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论