tags: OC 30 day
创建对象,类名 *指针名 = [类名 new];
new实际上是一个类方法。
new 方法的作用:
new 方法的内部,其实事先调用了 alloc方法,再调用了init方法。
什么是 alloc 方法?
alloc方法是一个类方法
作用: 那一个类调用这个方法,就创建那个类的对象,并把对象返回。
什么是 init 方法?
作用:初始化对象,为对象的属性赋初始值,这个init方法我们叫做构造方法。
init方法做的事情:初始化对象。
为对象的属性赋默认值。
如果属性的类型是基本数据类型就赋值为0
c指针 NULL
OC指针 nil
所以,我们创建一个对象如果没有为这个对象的属性赋值,这个对象的属性是有默认值的。
所以,我们每次新创建一个对象,这个对象的属性都被初始化了。
创建对象的完整步骤
应该是先使用 alloc创建一个对象,然后再使用init初始化这个对象,才可以使用这个对象。
虽然没有初始化的对象有的时候也可以使用,但是千万不要这么做。
使用一个未经初始化的对象是极其危险的。
alloc 相当于申请内存空间,init 再初始化对象。
Person *p1 = [Person new];
完全等价于
Person *p1 = [[Person alloc]init];
我们想要让创建的对象属性的默认值不是nil NULL 0
而是我们自定义的。
那么这个时候,我们就可以重写init方法。在这个方法。在这个方法中按照我们自己的想法为对象的属性赋值。
重写init方法的规範:
为什么要调用父类init的方法?
因为父类的init方法,会初始化父类的属性,所以必须要保证当前对象中的父类属性也同时被初始化。
为什么要赋值给self?
因为,调用父类的init方法,会返回初始化成功对象。实际上返回的就是当前对象。但是我们要判断是否初始化成功。
重写init 方法:
- (instancetype)init{if(self = [super init]){//初始化当前属性的代码;}return self;}
什么时候需要重写init方法:
如果你希望创建出来对象的属性的默认值不是nil NULL 0 而是我们指定的值。那么这个我们就可以重写init方法。
但是这样每次创建出来的对象属性值都是一样的。
我希望创建对象的时候,对象的属性值由创建对象的人来指定,而不是写死在init方法中。
自定义构造方法的返回值instancetype。自定义构造方法的名称必须以initWith开头。方法的实现与init的要求一样。-(instancetype)initWithName:(NSString *)name andAge:(int)age{if(self = [super init]){self.name = name;self.age = age;}return self;}
什么时候要自订义构造方法
在你需要初始化同时赋值。