内存管理策略(memory Management Policy)

NSObject protocol中定义的的方法和标准命名惯例一起提供了一个引用计数环境,内存管理的基本模式处于这个环境中。NSObject类定义了一个方法叫 dealloc,当对象销毁的时候,dealloc会被自动调用。本文描述,在Cocoa中所有正确管理内存基本规则,并提供了一些使用正确的例子。

【基本的内存管理规则】

内存管理模式基于对象的“所有权”上。任何对象都会被有一个或多个使用者引用,只要对象还有一个使用者,该对象就应该继续存在。如果一个对象没有使用者了,系统将自动销毁它。为了让开发者清晰的了解:使用对象和不再使用对象的场景,Cocoa设置了以下策略:
● 管好自己创建的对象。
   开发者使用alloc、new、copy和mutableCopy来创建对象。
● 使用retain来获得对象的所有权。
   某个函数接受的对象,通常保证在该函数调用期间仍然可用,并可以安全返回对象给上层调用者。开发者在以下两种情况下使用retain
1)在“访问函数”(accessor)的实现中或者在init方法,为了将对象作为自己的属性。
2)防止对象被其他操作释放掉,从而变为无效的对象。
● 当你不在需要的时候,必须放弃对象所有权。

一个简单的例子

看看下面的代码段,可以证明刚刚的所说的策略

  1. {
  2. Person *aPerson = [[Person alloc] init];
  3. // ...
  4. NSString *name = aPerson.fullName;
  5. // ...
  6. [aPerson release];
  7. }

Person被通过alloc创建之后,当Person不在使用的时候,发送了一个release的消息。name这个变量没有使用,所以name不必发送release消息。

使用autorelease来发送一个延迟的release

典型的使用场景:函数返回一个对象的时候。例如,你可以像这样实现fullName的方法:

  1. - (NSString *)fullName {
  2. NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
  3. self.firstName, self.lastName] autorelease];
  4. return string;
  5. }

上面就是典型的场景:你想放弃对象的所有权,但是又想让调用者在string销毁前使用返回值。

还可以通过下面的实现达到上面的效果:

  1. - (NSString *)fullName {
  2. NSString *string = [NSString stringWithFormat:@"%@ %@",
  3. self.firstName, self.lastName];
  4. return string;
  5. }

根据命名惯例,full name方法不具备返回值的所有权。因此,调用者无需对返回值string进行release

开发者不应该获得“通过引用传递的对象”的所有权

Cocoa中的一些方法,指定是传递引用。例如NSError对象包涵错误的信息,比
如:initWithContentsOfURL:options:error: (NSData) and
initWithContentsOfFile:encoding:error:
(NSString).这种情况,之前的规则中已经描述过了。你调用这些方法,但是没有创建NSError对象,所以,你没有它的所有权。因此不用
release,比如:

  1. NSString *fileName = <#Get a file name#>;
  2. NSError *error;
  3. NSString *string = [[NSString alloc] initWithContentsOfFile:fileName
  4. encoding:NSUTF8StringEncoding error:&error];
  5. if (string == nil) {
  6. // Deal with error...
  7. }
  8. // ...
  9. [string release];

【实现dealloc放弃对象的所有权】

NSObject类定义了一个方法dealloc,当某个对象没有使用者,并它的内存是可再生的,delloc就自动被调用。delloc的角色就是释放对象占用的内存并且处理自己所拥有的资源,包括本身变量的释放。
下面的代码展示了,如何实现Person类的dealloc函数。

  1. @interface Person : NSObject
  2. @property (retain) NSString *firstName;
  3. @property (retain) NSString *lastName;
  4. @property (assign, readonly) NSString *fullName;
  5. @end
  6. @implementation Person
  7. // ...
  8. - (void)dealloc
  9. [_firstName release];
  10. [_lastName release];
  11. [super dealloc];
  12. }
  13. @end

【重要】
任何时候,不要直接调用某一对象的dealloc。
不许在dealloc的最后一行调用父类的dealloc
不要尝试管理系统资源。(参考内存管理实践)
应用程序终止的时候,对象的dealloc可能不会被调用。因为进程的内存是自动清除退出,让操作系统清理资源比调用所有的内存管理方法更有效地。

Core Foundation使用相似的却又不同的规则

点击查看原文地址

iOS 内存管理策略的更多相关文章

  1. iOS内存管理策略和实践

    转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...

  2. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  3. iOS内存管理

    iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...

  4. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  5. iOS内存管理个人总结

    一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...

  6. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  7. Rs2008内存管理策略

    Rs2008 在内存管理方面已经有了很大的改变.主要增加了文件缓存,允许把内存数据卸载到文件缓存中.而Rs2005 都是把数据放到内存中.对于大数据量的报表而言,很容易出现OutOfMemory 错误 ...

  8. iOS内存管理编程指南

    iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...

  9. iOS内存管理(一)

    最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...

随机推荐

  1. nginx正则配置解释和fastadmin

    参考:http://www.cnblogs.com/netsa/p/6383094.html 1 2 3 4 5 6 7 8 9 10 11 1.^: 匹配字符串的开始位置:   2. $:匹配字符串 ...

  2. python3.x 多路IO复用补充asyncio

    asyncio模块是python之父写的模块,按说应该是靠谱的,python3.6版本定义为稳定版本. 说明书:https://docs.python.org/3/library/asyncio.ht ...

  3. css兼容处理-hack

    浏览器兼容之旅的第二站:各浏览器的Hack写法 Browser CSS Hacks Moving IE specific CSS into @media blocks Detecting browse ...

  4. read content in a text file in python

    ** read text file in pythoncapability: reading =text= from a text file 1. open the IDLE text editor  ...

  5. cdev_add

    初始化 cdev 后,需要把它添加到系统中去.为此可以调用 cdev_add()函数.传入cdev 结构的指针,起始设备编号,以及设备编号范围. 函数首先将分配的设备号与设备数目保存进cdev结构体中 ...

  6. checkStyle使用手册

    1. Annotations(注解:5个) Annotation Use Style(注解使用风格) 这项检查可以控制要使用的注解的样式. Missing Deprecated(缺少deprecad) ...

  7. H5系列之History(必知必会)

    H5系列之History(必知必会)   目录 概念 兼容性 属性 方法 H5方法       概念     理解History Api的使用方式 目的是为了解决哪些问题   作用:ajax获取数据时 ...

  8. appium+python自动化-adb shell按键操作(input keyevent)

    前言 接着上篇介绍input里面的按键操作keyevent事件,发送手机上常用的一些按键操作 keyevent 1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两 ...

  9. 九度oj 题目1450:产生冠军

    题目描述: 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C. 如果A打败了B ...

  10. 【bzoj4242】水壶 BFS+最小生成树+倍增LCA

    题目描述 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入 ...