Objective-c 第9-10-11章

本文深入探讨了Objective-C中的内存管理原则,包括引用计数、对象所有权、自动释放池以及初始化方法的使用。详细解释了如何正确地管理对象的生命周期,避免内存泄漏,并介绍了在iOS开发中遵循的内存管理规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第九章 内存管理


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,到底应该如何选择呢?

区别:

1initWithFormat是实例方法

只能通过 NSString* str = [[NSString alloc] initWithFormat:@"%@",@"Hello World"] 调用,但是必须手动release来释放内存资源

2stringWithFormat是类方法

可以直接用 NSString* str = [NSString stringWithFormat:@"%@",@"Hello 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值