2、Objective-C 内存管理规则
那么Objective-C是如何管理内存的?难么就不得不从Objective-C的根类说起NSObject-C中还有其他根类,不像Jave里有一个Jave.lang.
2、Objective-C 内存管理规则
那么Objective-C是如何管理内存的?难么就不得不从Objective-C的根类说起NSObject-C中还有其他根类,不像Jave里有一个Jave.lang.Obejiect根类。其他所有的类都直接或者间接的继承于它.因此,jave代码刻意i依旧任何对象来实现它的基本方法。
NSObject protocol 中定义的方法和标准命名惯例一起提供了一个引用计数环境,内存dealloc 会被自动调用.本文描述在Cocoa中所有正确管理内存的基本规则,并提供了一些使用正确的例子.
内存管理模式基于对象的"所有权"上.任何对象都会被一个或多个使用者引用,只要对象还有一个使用者,该对象就应该存在.如果一个对象没有了使用者了,系统将自动效果会它.为的是让开发者清晰的了解使用对象和不在使用对象的场景,Cocoa 设置了以下策略.
(1)管好自己的创建的对象.开发者使用alloc new copy
和mutableCopy
来创建对象.
(2)使用retain
来获得对象的所有权.某个函数接受的对象,通常保证在该函数调用期间仍然可用,并可以返回对象给上层调用者.开发者在以下两种情况下使用retain:"在访问函数"(accessor)的实现中或在init方法,为了将对象作为自己的属性.
防止对象被其他操作释放掉从而变成无效的对象.
(3)当不需要的时候,必须放弃对象所有权
一个简单的例子,看下面的代码段可以证明如上所说的策略:
{
Preson *aperson = [Pesrson alloc]init];
NSSting *name = aperson.fullName;
[aPersom release];
}
Person 被通过alloc 创建后,当Person 不在使用时,发送一个release的消息.name这个变量没用使用,所有name不必发送release消息.
尽管,典型的内存管理是作用于单个对象,但其实项目标主要通过管理对象图来完成,如图所示.务必必须确保内存中存在的对象不超过实际需要对象的个数.
Objctive-C提供两种内存管理的方法:
MRR(Manual Retain Release),需要显示管理内存通过跟踪对象的所有权.MRR基于NSObject类在运行时提供的引用计数实现的.
ARC(Automatic Reference Counting),系统使用相同的引用计数基于MRR,但在编译时, 为开发者适当插入一些内存管理方法.强烈建议开发这在新项目中使用AR�C
.
内存产生问题主要有两方面的原因:
(1)释放或覆盖正在使用数据.这将造成内存损坏,造成应用程序崩溃,或者更坏的情况是损坏用户数据.
(2)没有释放数据,导致内存泄漏.泄漏导致应用程序的内存使用量逐渐增加,这反过来又可能会导致系统性能较差或者应用程序被终止.
从引用计数内存管理的角度思考往往是适得其反,因为这样会考虑内存管理方面的实现细则,而不是自己的实际目标.相反,应该想到内存管理对象所有权和对象图的角度.
(3)Cocoa 使用简单的命名惯例来指示是否有函数返回的对象.点击查看内存管理策略.
(4)内存管理基本策略很简单,有一些实际的步骤,可以使内存管理更轻松,有助于确保自己的程序仍然可靠和稳定,同时可最大限度地减少资源需求.点击查看内存管理实践.
(5)Autorelease pool 提供一种机制:让对象延迟releas.这个对象放弃所有权,但又想避免立即释放(如函数的返回值).有些时候,可能会使用自己的autorelease吃块.
点击查看自动释放池.
对象所有权策略是基于引用计数实现的.
对象所有权的策略是通过引用计数 --- 通常叫做 retain count 实现的. 每一个对象有一个retain count实现的.
(1)创建对象后,它的 retain count 是1;
(2)retain之后,retain count + 1.
(3)release之后,retain count - 1.
(4)autorelease 之后,在自动释放池最后-1.
(5)对象的retain count 减少到0时,对象被销毁.
不要显示调用对象的retain count结果往往具有误导性,作为开发者可能不了解框架如何对对象retain的.在调试内存管理中,应该只关注确保自己的代码遵循所有权规则.
#######要点1
(1)内存可看做是内存控制器与CPU之间的桥梁,内存也就相当于仓库如何能合理利用内存是写好一个高性能应用程序的关键所在.一个应用程序过量的占用内存,势必会影响到其他内存的生存.
(2)Objective-C 内存管理模式基于对象的"所有权"上.任何对象都会被一个或多个使用者引用,只要对象还有一个使用者,该对象就应该继续存在.如果一个对象没有使用者了,系统将自动行销毁它.
(3)对所有权策略是基于引用计数实现的,每一个对象有一个retaincount变量.创建对象后,它的retaincount是1,retain之后,retain count +1;release之后,retaincount - 1;对象的retain count减少到0时,对象被销毁.