在为对象分配了内存空间之后要初始化对象时,我们希望初始化的结果是对象中的成员变量是有值的,但是默认情况下,init方法是不会给予这些成员变量以我们想要的值的,这个时候我们就应该重写或者自定义init方法。
重写父类的init方法
-(instancetype)init{
self = [super init];//super 告诉编译器从当前对象所属类的上一级去查找(父类)
if (self!=nil) {
self.age=18;
self.name=@"lsr";
}
return self;
}
上面就是重写的代码,首先是init方法的返回值--instancetype类型表示init返回的是一个实例变量(对象),然后self指的是当前调用init方法的对象,类似于C++中的this指针。由于当前的类的init方法是继承了他父类的方法,因此,在等号右边我们调用了一个方法super表示继承层次的上一级(父类),但是super不是父类。因为一个对象是无法自己初始化自己的,这里我们用父类的init方法来初始化当前的对象。下面的判断语句就是我们为这个对象中的成员变量赋予我们想要的初值的过程,最后返回这个对象。
在调用的时候:
##import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person * lsr=[[Person alloc] init];
Person * lsr1=[Person new];
}
return 0;
}
以上两种调用的方式是等价的,new 调用的也是重写了的init方法。
但是由于父类中的init方法是没有参数的,如果我们在重写init方法时加了参数是会出现错误的。但是如何满足我们添加参数的需求呢,我们可以采用自定义init方法来解决这个问题。
自定义init方法
-(instancetype)initWithName:(NSString *)aName andAge:(NSInteger)aAge{
self = [super init];
if (self!=nil) {
self.age=aAge;
self.name=aName;
}
return self;
}
与重写不同,自定义是要在头文件里声明的,自定义init函数的名字必须写成 initWithxxx 的形式,大小写也不能改变,不然编译器是识别不出来的。这样我们就可以给已经分配了空间的对象初始化我们自己想要的值了。
##import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person * lsr=[[Person alloc] initWithName:@"lsr" andAge:18];
}
return 0;
}
这里要注意就是new方法不会调用我们自定义的init方法,它只会调用重写的init方法。