OC中,如何声明一个构造函数呢?以及在声明构造函数时,构造函数的返回类型可以写instancetype和id,那么这两个关键字到底有什么区别呢?声明构造函数时,用哪种方法更好呢??我们就来探讨一下。
声明构造函数
OC中,声明构造函数的语法,和Java,C++,C#等语言是有一些不一样的。首先,构造函数有返回类型,而且,并不是通过参数列表的不同,来重载构造函数。比如我们在很多面向对象语言里,都会看到类似如下的构造函数:
class Student
{
Student()
{
}
Student(int name, int age)
{
this.name = name;
this.age = age;
}
}
但是在OC中,构造函数,或者叫构造方法,不但有返回值,而且不靠参数重载进行区分,是这样的:
-(instancetype) init
{
self = [super init];
if(self){
self.name = @"xiaoming";
self.age = @18;
}
return self;
}
而如果想要进行不同参数的构造方法重载,是这样写的
-(Student *) initWithAge (int) age : AndName (NSString *) name
{
self = [super init];
if(self)
{
self.age = age;
self.name = name;
}
return self;
}
感觉就完全是另一个普通的方法了,和构造函数没什么关系。
两个关键字的区别
特殊类型instancetype表明,从init方法返回的类型与它初始化类相同,也就是说,如果你发送初始化消息给Student对象,则编译器会推断出init方法的返回值就是Student类。而id类型需要在运行时才能确定init方法的返回类型。
id变量也可以用来声明变量,但是instancetype却不能用来声明变量。
哪个关键字更好
推荐使用instancetype关键字,因为被继承的初始化方法不能明确定义她们需要返回的对象类型。