Objective-c 第9-10-11章

Objective-c 第9-10-11章,第1张

概述第九章 内存管理 1.引用计数 每个对象都引用计数器,创建对象时,对象值为1;增加值向对象发送一条retain消息,减少对象的计数器值,发送release值。当计数器为0时,Objectijve-c向对象发送一条dealloc消息。 -(id) retain; //加 -(void) release; //减 -(unsigned) retainCount; //获得对象的计数器当前值 2.对象所

第九章 内存管理


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:@" 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章所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1061912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存