第九章 内存管理
1.引用计数
每个对象都引用计数器,创建对象时,对象值为1;增加值向对象发送一条retain消息,减少对象的计数器值,发送release值。当计数器为0时,Objectijve-c向对象发送一条dealloc消息。
-(ID) retain; //加
-(voID) release; //减
-(unsigned) retainCount; //获得对象的计数器当前值
2.对象所有权(object ownership)
问题1:计数器是自动还是要手动控制?
问题2:engine对象和newEngine对象指的是同一对象时,引用计数器是一个还是两个??书上例子是什么意思?
问题3: init方法
3。initWithFormat
//网上资料
今天在看书上的一段代码时,发现Nsstring实例化时,有时用的是initWithFormat方法,有时用的是stringWithFormat,到底应该如何选择呢?
区别:
1、initWithFormat是实例方法
只能通过 Nsstring* str = [[Nsstring alloc] initWithFormat:@"%@",@"Hello World"] 调用,但是必须手动release来释放内存资源
2、stringWithFormat是类方法
可以直接用 Nsstring* str = [Nsstring stringWithFormat:@" World"] 调用,内存管理上是autorelease的,不用手动显式release
4..自动释放池:NSObject类提供了一条autorelease方法,当给一个对象发送autorelease消息时,实际上时将该对象添加到NSautoreleasePool中,当自动释放池被销毁时,会向池中所有对象发送release消息
-(ID) autorelease;
for example:
//------------------
- (Nsstring *) decription
{
Nsstring *description;
description = [ [Nsstring alloc]
initWithFormat:@"I am %d years old",4];
return ([descrition autorelease]);
} //description
NSLog (@"%d",[someObject description]); //由于descripition方法首先创建了一个新的字符串对象,然后自动释放该对象,内存管理问题得到 解决。
5.Cocoa内存管理规则
1.当你使用new、alloc或copy方法创建一个对象时,该对象的保留计数器值为1。当不再使用该对象时,你要负责向该对象发送一条release或autorelease消息。这样,该对象将再其使用寿命结束时被销毁。
2.当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何 *** 作来确保该对象被清理。如果你打算在一段时间内拥有该对象,则需要保留它并确保在 *** 作完成时释放它。
3.如果你保留了某个对象,你需要(最终)释放或自动释放该对象。必须保持retain方法和release方法的使用 次数相等。
简单来说就是
1.创建对象时,计数器值为1,不再使用对象时,你需要向对象发送一条release或autorelease消息
2.获得一个对象,且对象的计数器值为1,且已经被设置为自动释放,则不需要任何 *** 作来确保该对象被清理
3.如果保留了某个对象,你需要释放或自动释放该对象。retain次数等于release次数
简单记住:“如果我使用了new.alloc或copy方法获得一个对象,则我必须释放或自动释放该对象。”
内存管理规则:
获得途径 临时对象 拥有对象
alloc/new/coy 不再使用时释放 在dealloc方法中释放对象
任何其他方法 不需要任何 *** 作 获得对象时保留,再dealloc方法中释放对象
4.如果开发iPone软件,则不能使用垃圾回收,实际上,在编写iPhone程序时,苹果公司建议你不要在自己的代码中使用autorelease方法,同时还要避免使用创建自动释放对象的便利函数
5.每个对象都维护一个保留计数器。对象被创建时,其保留计数器值为1;对象被保留时,保留计数器值加1;对象被释放时,保留计数器值减1;当保留计数器值归0时,对象被销毁。在销毁对象时,首先调用对象的dealloc方法,然后回收其占用的内存以供其他对象使用。
当对象接受到一条autorelease消息时,其保留计数器值并不立即改变。相反,该对象只是被放入NSautoreleasePool中,当自动释放池被销毁时,会向池中的所有对象发送release消息,所有被自动释放的对象都将其保留计数器值减1。如果保留计数器值归0,则对象被销毁。
第 10 章 对象初始化
1.两种创建对象的不同方法:
第一种方法是 [类名 new]
第二种方法是[[类名 alloc] init]
方法时等价的,不过Cocoa的惯例是使用alloc和init,而不是用new,一般情况下,Cocoa程序员只是在不熟练使用alloc和init时,才用new
2.Objective-c将这两种 *** 作拆分为两个明确的步骤,分配和初始化。
for example:
Car *car = [Car alloc]
3.初始化对象方法,init方法几乎总是返回它们正在初始化的对象
Car *car = [ [Car alloc] init];
但是注意,不能这么写
Car *car = [ Car alloc];
[car init]
因为初始化方法返回的对象可能与分配的对象不同(类簇什么的。。)
4。问题drain与release
5.常用初始化方法:
- (ID) init
{
if(self = [super init]);
{...}
...
]
// [super init]作用是使超类完成它们自己的初始化工作,从根类NSObject继承的类调用超类的初始化方法。
6.便利初始化函数
Nsstring类中的一些初始化方法实例:
-(ID) init; //初始化一个新的空字符串,对不可变Nsstring类做不用不大,可以分配和初始化一个新的NSMutableString类的对象并开始向该对象中保存字符。
for example:
Nsstring *empeyString = [[Nsstring alloc] init]; //返回一个空字符串
-(ID) initWithFormat: (Nsstring *) format,…; //初始化一个新的字符串作为格式化 *** 作的结果
for example:
string = [[ Nsstring alloc]
initWithFormat:@"%d or %d",25,624];
//返回一个字符串,其值为“25 or 654”
-(ID) initWithContentsOffile:(Nsstring *) path; //方法打开指定路径上的文本文件,读取文件内容,并使用文件内容初始化一个字符串。
for example://读取文件 /tmp/words.txt
string * [[Nsstring alloc]
initWithContentsOffile: @"/tmp/words.txt"];
7.在Cocoa中,分配和初始化时两个分离的 *** 作:来自NSObject的类方法alloc为对象分配一块内存区域并将其清零,实例方法init用于获得一个对象并将其运行。
第11章 特性
1. Objective-C 2.0引入了特性property,,适用与MAX OS X10.5 //Core Animation效果??
2. property
//------
@interface ..
@ property float rainHandling;
…
@implementation ..
@synthesize rainHandling;
..
//-----------
注意 @property 与 @ synthesize 是成对出现的
3.对get和set方法迷茫,为什么用 @property 和 @synthesize 以后,就能省掉四个函数??(P177页)
4.
总结以上是内存溢出为你收集整理的Objective-c 第9-10-11章全部内容,希望文章能够帮你解决Objective-c 第9-10-11章所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)