iOS APP 开发 OC 第十六天,初始化器概述

tags: OC 30 day

创建对象,类名 *指针名 = [类名 new];

new实际上是一个类方法。
new 方法的作用:

  1. 创建对象
  2. 初始化对象
  3. 把对象的地址返回

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方法的规范:

  1. 必须先调用父类的init方法,然後方法的返回值复职给self。
  2. 调用init方法初始化对象有可能会失败,如果初始化失败。返回的就是nil。
  3. 判断父类初始化是否成功。判断self的值是否为nil,如果不为nil说明初始化成功。
  4. 如果初始化成功,就初始化当前对象的属性。
  5. 最後,返回self的值。

为什麽要调用父类init的方法?
因为父类的init方法,会初始化父类的属性,所以必须要保证当前对象中的父类属性也同时被初始化。
为什麽要赋值给self?
因为,调用父类的init方法,会返回初始化成功对象。实际上返回的就是当前对象。但是我们要判断是否初始化成功。

重写init 方法:

- (instancetype)init{
if(self = [super init]){
//初始化当前属性的代码;
}
return self;
}

什麽时候需要重写init方法:

如果你希望创建出来对象的属性的默认值不是nil NULL 0 而是我们指定的值。那麽这个我们就可以重写init方法。

但是这样每次创建出来的对象属性值都是一样的。

我希望创建对象的时候,对象的属性值由创建对象的人来指定,而不是写死在init方法中。

  1. 自定义构造方法的返回值instancetype。
  2. 自定义构造方法的名称必须以initWith开头。
  3. 方法的实现与init的要求一样。
-(instancetype)initWithName:(NSString *)name andAge:(int)age{
if(self = [super init]){
self.name = name;
self.age = age;
}
return self;
}

什麽时候要自订义构造方法

在你需要初始化同时赋值。


<<:  网络访问控制(network access control)

>>:  风险描述(risk descriptions)

[用 Python 解 LeetCode] (003) 80. Remove Duplicates from Sorted Array II

题干懒人包 给定一个排列好的列表,将它整理成重复项最多出现两次,比方说以下 [1,1,1,2,2,3...

安装FireBase入门 Day 10

今天转换一下跑道,来谈谈该如何安装FireBase 首先我先上网搜寻了二三十个网站,教我怎麽去安装F...

Day1:白兔

茕茕白兔,东走西顾。衣不如新,人不如故。心理学研究#怀旧,会让人变得积极乐观,本来想读VB重温16岁...

误格式化硬碟/记忆卡/随身碟?

给大家分享一个超实用的硬碟/行动硬碟/记忆卡/随身碟误格式化资料、照片、影片的救援方法。 我们知道,...

[Day-12] 条件运算子以及switch

昨天学习完if-else判断式 那今天再来补充上次运算子 没说完的条件运算子 条件运算子其实功能跟i...