和C++不同的是,object-c中并没有规定说一定要实现一个构造函数和析构函数;所以,在object-c中,其实没有构造函数和析构函数这样的概念,取而代之的应该是对象的创造和初始化,对象的释放。在object-c中,调用alloc/init其实就是进行对象的创造和初始化,或者,用户也可以自己写一个函数,只要完成类的数据成员的初始化,并且返回这个本实例的指针(self)即可。实例如下:
1. 代码:
在本系列实例“2.创建一个简单的类(object-c)”中,增加如下代码:
// Fraction.h
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(Fraction*) init: (int) n denominator: (int) d;
-(void) setNumerator: (int) n andDenominator: (int) d;
// Fraction.m
-(Fraction*) initWithNumerator: (int) n denominator: (int) d {
self = [super init];
if ( self ) {
[self setNumerator: n andDenominator: d];
}
return self;
}
-(Fraction*) init: (int) n denominator: (int) d {
self = [super init];
if ( self ) {
[self setNumerator: n andDenominator: d];
}
return self;
}
-(void) setNumerator: (int) n andDenominator: (int) d {
numerator = n;
denominator = d;
}
// main.m
#import <stdio.h>
#import "Fraction.h"
int main( int argc, const char *argv[] ) {
// create a new instance
Fraction *frac = [[Fraction alloc] init];
Fraction *frac2 = [[Fraction alloc] init];
Fraction *frac3 = [[Fraction alloc] initWithNumerator: 1 denominator: 3];
Fraction *frac4 = [[Fraction alloc] init: 1 denominator: 4];
// set the values
[frac setNumerator: 1];
[frac setDenominator: 1];
// combined set
[frac2 setNumerator: 1 andDenominator: 2];
// print it
printf( "The fraction is: " );
[frac print];
printf( "\n" );
printf( "Fraction 2 is: " );
[frac2 print];
printf( "\n" );
printf( "Fraction 3 is: " );
[frac3 print];
printf( "\n" );
printf( "Fraction 4 is: " );
[frac4 print];
printf( "\n" );
// free memory
[frac release];
[frac2 release];
[frac3 release];
[frac4 release];
return 0;
}
2. 编译:同示例2 .
3.说明:
(1). initWithNumerator 和 init都可以认为是Fraction的构造函数,但是,init是重写了父类(NSObject)而实现的; 而initWithNumerator可以认为是一个普通函数,但完成了Fraction的初始化,所以,也可以认为是一个构造函数。因为object-c中没有像c++或java中的构造函数必须与类名同名这一限制条件。
(2).一定要在实现代码的时候,先调用父类的init,再初始化自己的数据成员,并且返回self.
(3).事实上,init的函数返回值应该定义为id.