前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高级内存管理指南

高级内存管理指南

作者头像
nimomeng
发布2018-09-13 14:23:16
3690
发布2018-09-13 14:23:16
举报
  1. 好的习惯可以防止内存相关的问题 a) 在反复使用同一个数据时释放掉或者覆盖掉。 b) 当数据不再被使用时如果不释放掉,会造成内存泄露。
  2. 基本的内存管理准则: a) 你拥有你创建的任何对象的管理权。诸如:alloc,copy,new,mutableCopy, 等待创建的对象适用此规则。 b) 使用了retain的对象你需要管理。 在以下两种情况下你要使用retain: i. 实现了访问方法,或者一个init方法; ii. 保证一个对象不被其它操作引起失效 c) 当不需要对象时,需要自己释放这个对象。 通过releas或者autorelease方法。 d) 不能释放一个你没有所有权的对象。
  3. 通过引用返回的对象你没有所有权 Cocoa里面的一些方法返回的是引用:(对象为ClassName ** 或者 id *),比如通过initWithContentsOfUrl:options:error: (NSData)中的NSError对象,不能随意release。
  4. 在重写setter方法时,必须要在retain操作之后再进行释放,以免set的是相同变量。
  • (void)setCount: (NSNumber *)newCount { [newCount retain]; [_count release]; _count = newCount; }
  1. 两种创建变量的方法比较: a) 通过NSNumber变量进行alloc,所以需要release: NSNumber *zero = [[NSNumber alloc] initWithInteger:0]; [zero release]; b) 第二种方式是使用一个方便的构造器来返回,因此不需要retain或者release: NSNumber *zero = [NSNumber numberWithInteger:0];
  2. 避免在使用时造成deallocing: a) 当对象被移除时; b) 当指针被deallocated时
  3. Autorelease Pools: autorelease pool 是NSAutoreleasePool的实例,在此实例中会接收autorelease消息。当autorelease pool被dealloced,会发release消息给每一个对象。 一个对象可以被放到autorelease pool多次,每一次进入pool时都会接收到release消息。
  4. AutoreleasePool是按照栈来存储的,最近使用的pool在栈顶。
  5. Autorelease pool应该在以下三种情况下手动使用: a) 如果项目不是基于UI framework,比如 command-line tool b) 如果一个循环内有很多临时变量。释放这些变量有助于降低内存峰值 c) 在线程被调用时必须启用自己的autorelease pool,不然程序会内存泄露。
  6. 每一个线程包含自己的NSAutoreleasePool对象。当一个线程终止时,它所在的autorelease pool自动释放。
  7. 如果drain了不在栈顶的autorelease pool,则所有在它之上的pool都会被drained。(所有相关的对象都会收到release)
  8. GC没有使用autorelease pool
  9. 在GC环境,release 不是一个命令。NSAutorelease Pool 因此提供了一种drain命令,在标签计数环境和调用release是等价的;在gc环境下会出发gc。所以,应当尽可能使用drain而非release命令。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档