繼承
- 上層:父類;下層:子類
- 繼承是單向的,不能相互繼承
- 集成具有傳遞性:A繼承於B,B繼承於C,A具有B和C的特徵和行爲
- 子類能繼承父類全部的特徵和行爲
- 把公共的⽅法和實例變量寫在父類⾥裏,子類只需要寫⾃⼰己獨有的實例變量和方法即可
- 繼承既能保證類的完整,又能簡化代碼
- 沒有父類的類稱爲根類,OC中的根類是NSObject(祖宗)
繼承實現
// 子類 父類
@interface CommonZombie : NSObject{
}
#import "CommonZombie.h"
// 子類 父類
@interface BarricadeZombie : CommonZombie{
}
繼承中方法的執行:逐級向上查找
給CollegeStudent對象發送消息: study
- 查找本類中是否實現(重寫)study⽅法
- 如果沒有,查找⽗類中study是否實現
- 逐級向上查找,找到即執⾏
- 如果NSObject也沒實現,會拋出異常,引起Crash
super
super是編譯器指令,並⾮對象。
作⽤:給super發消息,可以執⾏⽗類中實現的⽅法
⼦類可以重寫⽗類的⽅法,即:⼦類既有⾃⼰的實現,⼜有⽗類繼承下來的實現,如果想使⽤⽗類的實現,向super發送消息
初始化⽅法
創建對象分兩步:開闢空間、初始化。
初始化⽅法的主要作⽤是:爲某些實例變量賦初值。
初始化⽅法在對象的整個⽣命週期⾥只使⽤⼀次。
- (id) init
{
//給super發送init消息:即執行父類中實現的init方法
self = [super init];
if(self)
{
//初始化設置
}
//返回初始化完成的對象
return self;
}
⼦類定義了除⽗類中公共實例變量之外的實例變量。在⾃⾝的初始化⽅法中,優先向super發送init消息,初始化公共變量,初始化成功之後,再初始化⾃⾝特有變量,從⽽完成全部實例變量的初始化
初始化過程
- ⾃⼰的初始化⽅法中,優先調⽤⽗類的初始化⽅法
- ⽗類的初始化⽅法中再調⽤⽗類的初始化⽅法,依次往上調⽤
- 處於最上層的初始化完成之後,回到第⼆層的初始化⽅法中,完成第⼆層的初始化
- 第⼆層的初始化完成之後,回到第三層的初始化⽅法中,依次執⾏初始化⽅法,直到本類的初始化⽅法完成
初始化⽅法特徵
- 初始化⽅法是 “-”⽅法(對象方法)
- 返回值類型是:id或者instancetype
- 以init開頭
- 可以帶0到多個參數
- 內部實現:先執⾏super的初始化⽅法,再初始化⾃⾝變量,return self
便利構造器
- 封裝了對象創建過程
- 便利構造器是“+”⽅法,返回本類型的實例,⽅法名以類名開頭
- 可以有0到多個參數
- 內部實現:封裝了alloc和初始化⽅法。使⽤起來更加簡潔
便利構造器的實現
//聲明和實現便利構造器
+(id)personWithName:(NSString *)name
{
Person *p =[[Person alloc] initWithName:name];
return p;
}
//使用便利構造器創建對象
Person *p = [Person personWithName:@"張三"];