第十章對象初始化


創建新對象的兩種不同方法:
第一種方法:[類名 new]
第二種方法:[[類名 alloc] init]
這兩種方法是等價的,不過Cocoa的慣例是使用alloc和init,而不使用new
一、分配對象
alloc
分配allocation是從操作系統獲得一塊內存並將其指定爲存放對象的實例變量的位置
  1. 向某個類發送alloc消息就是爲該類分配一塊足夠大的內存,以存放該類的全部實例變量
  2. alloc方法還順便將這塊內存的全部區域初始化爲0,以避免初始化內存問題
二、初始化對象init
初始化initialization從操作系統取得一塊內存,準備用於存儲對象,init方法總是返回它正在初始化的對象

    應像下面這樣嵌套調用alloc和init方法:
Car *car = [[Car alloc] init];
    因爲初始化方法返回的對象可能與分配的對象不同,所以嵌套調用是比較理想的
1、編寫初始化方法
舉例代碼:
-(id)init
{
       if(self = [super init]){
engine = [Engine new];
       }
    }
if(self = [super init]){暗示在方法中self對象可能發生改變
首先,執行[super init]其作用是使超類完成他們自己的初始化工作,一般都是NSObject類
然後,init方法可能返回完全不同的對象,如果返回不同的對象則需要更新self,即執行if中的代碼
self = [super init]可以捕捉到返回的nil值所以推薦使用這種形式
2、初始化時做什麼
init方法給實例變量賦值並創建對象完成任務所需的其他對象

惰性求值lazy evaluation,即在初始化時不提供對自定義對象屬性的調用,等到調用者需要時在創建對象

三、便利初始化函數convenience initializer
便利初始化函數是用來完成某些額外工作的初始化方法,以init開頭的方法
以NSString類爲例
-(id)init;//普通初始化函數
-(id)initWithFormat:(NSString *)format;//便利初始化函數
-(id)initWithContentsOfFile:(NSString *)path;//便利初始化函數
構造自己的便利初始化函數
-(id)initWithPressure:(float)p treadDepth:(float)td
{
     if(self = [super init]){
         pressure = p;
         treadDepth = td;
     }
     return(self);
}
四、初始化函數
指定初始化函數designated initializer,通常接受參數最多的初始化方法最終成爲指定初始化函數

初始化函數規則:
1、如果不需要設置任何狀態或者只需要alloc方法將內存清零,則不需要創建初始化函數
2、如果構造了一個初始化函數,則一定要在自己指定的初始化函數中調用超類的指定初始化函數
3、如果初始化函數不止一個,則要選擇一個作爲指定初始化函數。被選定的方法應該調用超類指定的初始化函數,並實現所有其他初始化函數


看得有點亂吧,我也很暈
發佈了0 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章