现在的位置: 首页 > 综合 > 正文

Object-c学习笔记十一—–对象初始化

2017年08月17日 ⁄ 综合 ⁄ 共 2850字 ⁄ 字号 评论关闭

创建新对象有两个方法:第一种方法就是[类名 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
= [super
init
];

   
if
(self) {

       // Initialization code here.

       
pressure
=34.0;

       
treadDepth
=20.0;

    }

    

   return
self;

}

-(void) setPressure:(float)p

{

   pressure=p;

}

-(void) setTreadDepth:(float)t

{

   treadDepth=t;

}

-(float) pressure

{

   return
pressure;

}

-(float) treadDepth

{

   return
treadDepth;

}

- (NSString *) description

{

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

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

   
return
desc ;

@end

main()函数中

  NSAutoreleasePool *pool;

    pool=[[NSAutoreleasePoolalloc]
init];

    

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

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

    {

       
Tire
*tire =[[Tire
alloc
]init];

        [tire
setPressure
:23+i];

        [tire
setTreadDepth
:33-i];

        

        [car
setTire
:tire atIndex:i];

        //[tire
release
];

    }

    

   
Engine
*engine=[[Slant6
alloc
]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
=[[NSMutableArray
alloc
]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: index
withObject: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

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

抱歉!评论已关闭.