4.5 初始化方法
我们先回忆一下创建五号机器人对象的方法。
CRobot *robot5 = [[CRobot alloc] init];
代码中,初始化对象robot5时调用了两个方法,即alloc和init。其中,alloc方法用于创建一个基本的CRobot对象,接下来的init方法就是对象的初始化方法。
在Objective-C中约定,在类中以init开头的方法都会假设为对象的初始化方法,所以,在对自定义的方法命名时,应该注意这一点。
除了init方法,我们还可以创建更多的初始化方法,如下面的代码,我们就在CRobot类的接口部分声明了一个初始化方法。
@interface CRobot: NSObject -(instancetype) initName:(NSString*)n andSpeed:(float)s; @end
然后,我们在类的实现部分定义这个初始化方法,如下面的代码。
@implementation CRobot -(instancetype) initName:(NSString*)n andSpeed:(float)s { self = [super init]; if (self) { self.name = n; self.speed = s; } return self; } @end
我们先看一下代码中新出现的三个关键字:
❑ instancetype,指定初始化方法的返回值为instancetype类型,表示此方法会返回当前类类型的对象(实例)。
❑ super,表示父类(基类、超类)对象。
❑ self,表示当前对象。
这三个关键字的作用,我们会在4.6节中详细介绍。
现在,我们回到初始化方法中,下面的代码演示了这个自定义初始化方法的使用。
CRobot *robot5 = [[CRobot alloc] initName:@"NO.5" andSpeed:50.0]; NSLog(@"%@ 的速度是 %f km/h", robot5.name, robot5.speed);
我们看到,使用初始化方法,可以简化很多的对象初始代码,而且通过多个初始化方法,可以快速创建多种形式的对象,在很大程度上提高开发效率。
创建和使用初始化方法时,有一些问题需要我们注意:
❑ 初始化方法的返回值类型应该定义为instancetype,而在早期的Objective-C代码中,初始化方法返回值通常定义为id类型。
❑ 初始化方法都应该以init开头。
❑ 初始化方法的参数定义与普通方法的参数定义相同。
❑ 在初始化方法中,一般情况下,都应该先使用super关键字调用基类的初始化方法,以保证初始化工作的完整性。
❑ 为了简化代码,我们也可以在初始化方法中调用本类中其他的初始化方法,此时,应使用self(当前实例)调用,如[self init]。