Iphone开发基础篇(十)-ObjectC之对象初始化

Iphone开发基础篇(十)-ObjectC之对象初始化,第1张

概述创建新对象有两个方法:第一种方法就是[类名 new] ,第二种方法是[[类名 alloc ] init ],这两种方法时等价的。 在Cocoa里面常用的则是alloc和init方法。 alloc实际是allocation(分配),可以理解为初始化时分配出足够的内存空间。alloc方法将分配的内存初始化。所有的Bool类型初始化为NO,所有的int类型初始化为0,所有的float类型初始化为0.0,

创建新对象有两个方法:第一种方法就是[类名 new] ,第二种方法是[[类名 alloc ] init ],这两种方法时等价的。

在Cocoa里面常用的则是alloc和init方法。

alloc实际是allocation(分配),可以理解为初始化时分配出足够的内存空间。alloc方法将分配的内存初始化。所有的Bool类型初始化为NO,所有的int类型初始化为0,所有的float类型初始化为0.0,所有的指针被初始化为nil。

分配的对象是不能立即使用,必须初始化。

initialization(初始化)既是在 *** 作系统取得内存,准备用于存储对象。

Car *car =[ [ Car alloc ] init];

而不是 Car * car =[Car alloc]; [car init]; 因为初始化方法返回的对象可能于分配的对象不同。

编写初始化方法if(self=[superinit])

我们在CarParts程序中出现了两种初始化方式。第一种是在init方法中创建engine对象和4个trIE对象。另一种则是不创建任何对象,而是为engine和tire对象预留位置。

即使不提供对自定义对象属性的调用,也仍然应该等到调用者需要时再创建对象。这种技术被称为惰性求值(lazy evaluation)

便利初始化函数(convenIEnce initializer)

Nsstring *emptyString=[[Nsstring alloc] init];返回一个空字符串。

string =[[Nsstring alloc] initWithFormat:@"%d or %d",25,624]; 返回一个字符串。

string =[[Nsstring alloc] initWithContentsOffile:(Nssting *) path];完成了打开文件读取数据块,追加字符串,确保零字节位于适当位置,以及关闭文件。

Tire类的初始化

@interface Tire :NSObject

{

float pressure;//轮胎花纹深度

float treadDepth;//轮胎压力

}


-(voID) setPressure :(float) pressure;//set方法

-(voID) setTreadDepth :(float) treadDepth;//set方法


-(float) pressure;//get方法

-(float) treadDepth;//get方法

@end


@implementation Tire

- (ID)init

{

self = [superinit];

if (self) {

// Initialization code here.

pressure=34.0;

treadDepth=20.0;

}

returnself;

}

-(voID) setPressure:(float)p

{

pressure=p;

}

-(voID) setTreadDepth:(float)t

{

treadDepth=t;

}

-(float) pressure

{

returnpressure;

}

-(float) treadDepth

{

returntreadDepth;

}

- (Nsstring *) description

{

Nsstring *desc ;//因为desc不是通过alloccopynew方法创建的,所以它在计数器值为1。当自动池销毁时,该字符串对象被清理

desc=[NsstringstringWithFormat:@"Tire:Pressure:%.1f TreadDepth:%.1f",pressure,treadDepth];

return desc ;

}

@end


main()函数中

NSautoreleasePool *pool;

pool=[[NSautoreleasePoolalloc]init];

Car *car =[[Caralloc]init];

for(int i=0;i<4;i++)

{

Tire *tire =[[Tirealloc]init];

[tire setPressure:23+i];

[tire setTreadDepth:33-i];

[car setTire:tireatIndex:i];

//[tire release];

}

Engine *engine=[[Slant6alloc]init];

[car setEngine:engine];

//[engine release];

[car print];

//[car release];

如果不在object-c2.0中则需要注释部分,因为object-c中有垃圾回收机制。

在Car类中我们可以用一个可变NSMutableArray来存储轮胎。以此简化代码。

- (ID) init

{

if (self = [superinit]) {

engine = [[Enginealloc]init];

tires=[[NSMutableArrayalloc]init];

for (int i=0; i<4; i++) {

[tiresaddobject:[NSNullnull]];

}

}

return (self);

}// init

- (Engine *) engine

{

return (engine);

}// engine

- (voID) setEngine: (Engine *) newEngine

{

[newEngineretain];//保留以前传入的对象并释放当前对象

[enginerelease];

engine = newEngine;

}// setEngine

- (voID) setTire: (Tire *) tire

atIndex: (int) index

{

[tiresreplaceObjectAtIndex: indexwithObject:tire];//从数组中删除现有对象并用新对象替代。

}// setTire:atIndex:

- (Tire *) tireAtIndex: (int) index

{

Tire *tire;

tire=[tiresobjectAtIndex:index];

return tire;

}// tireAtIndex:


-(voID) dealloc

{

[tiresrelease];

[enginerelease];

}


- (voID) print

{

for (int i=0; i<4; i++) {

NSLog(@"%@",[selftireAtIndex:i]);

}

NSLog(@"%@",engine);

}// print


初始化函数规则,如果构造一个初始化函数,则一定要在自己指定初始化函数中调用超类的指定初始化函数;如果不止一个初始化函数,则要选择一个指定初始化函数。

总结

以上是内存溢出为你收集整理的Iphone开发基础篇(十)-ObjectC之对象初始化全部内容,希望文章能够帮你解决Iphone开发基础篇(十)-ObjectC之对象初始化所遇到的程序开发问题。

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

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

原文地址:https://54852.com/web/1054403.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存