iT邦幫忙

0

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;
}

什麼時候要自訂義構造方法

在你需要初始化同時賦值。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言