1、init
OC中的init方法的作用是在对象实例化后对其初始化,在其它编程语言中(如Java、C++)都有构造方法,OC中init方法和构造方法是一个概念的。
例如:我们创建一个Person 类,继承自NSObject
@interface Person : NSObject
@property (nonatomic, strong, nullable) NSString *firstName;
@property (nonatomic, strong, nullable) NSString *lastName;
@property (nonatomic, strong, readonly) NSString *fullName;
+(void)test12;
@end
调用Person类的类方法new
Person *person=[Person new];
其等价于
Person *person=[[Person alloc] init];
其中alloc方法用于实现化一个对象,init用来将对象初始化。
默认的初始化规则是:
基本数据类型初始化为0
指针数据类型初始化为空
如果我们不想使用默认的初始化规则,则可以重写init方法或自定义init方法。
2、为什么要重写init 方法
例如:
(id)init {
self = [super init];
if (self) {
// Initialize self.
}
return self;
}
-
重写
self = [super init];
的的作用
面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化, -
self 为什么要赋值为[super init]:
简单来说是为了防止父类的初始化方法release掉了self指向的空间并重新alloc了一块空间。还有[super init]可能alloc失败,这时就不再执行if中的语句。 -
子类拥有的成员变量包括自己的成员变量以及从父类继承而来的成员变量,在重写构造方法的时候应该首先对从父类继承而来的成员变量先进行初始化。
◆原则:先初始化父类的,再初始化子类的。
◇先调用父类的构造方法[super init];
◇再进行子类内部成员变量的初始化。
我们将重写Person类的init方法
-(instancetype)init{
if (self = [super init]) {
self.firstName = @"wagn";
self.lastName = @"cc";
}
return self;
}
我们调用Person ,
Person *person = [[Person alloc]init];
NSLog(@"%@---%@",person.firstName,person.lastName);
打印结果:
2020-09-03 17:38:20.318644+0800 TEST[976:5177869] wagn---cc
总结:重写构造方法的目的:为了让对象方法创建出来,成员变量就会有一些固定的值。
3、 自定义的init方法
自定义的init方法常用于在初始化对象时指定对象的值,同样的,自定义的init方法也需要遵守一定的语法规范:
-(instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName{
self = [super init];
if (self) {
self.firstName = firstName;
self.lastName = lastName;
}
return self;
}
我们调用初始化方法
Person *person2 = [[Person alloc]initWithFirstName:@"小张" lastName:@"离"];
NSLog(@"%@---%@",person2.firstName,person2.lastName);
打印结构:
2020-09-03 17:43:22.155930+0800 TEST[1176:5185882] 小张---离
网友评论