Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

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]。