1.繼承 ①繼承既能保證類的完整,又能簡化代碼 ②簡化代碼 ③把公共的方法和實例變數寫在父類里,子類只需要寫自己獨有的實例變數和方法即可。 ④繼承的特點: 《1》沒有父類的類稱為根類,OC中的根類是NSObject(祖宗) 《2》繼承的上層:父類,繼承的下層:子類 《3》繼承的內容:所有的實例變數和
1.繼承 ①繼承既能保證類的完整,又能簡化代碼 ②簡化代碼 ③把公共的方法和實例變數寫在父類里,子類只需要寫自己獨有的實例變數和方法即可。 ④繼承的特點: 《1》沒有父類的類稱為根類,OC中的根類是NSObject(祖宗) 《2》繼承的上層:父類,繼承的下層:子類 《3》繼承的內容:所有的實例變數和方法 《4》繼承是單向的,不能相互繼承 《5》繼承具有傳遞性:A繼承於B,B繼承於C,A具有B和C的特征和行為 《6》如果子類不滿意父類方法的實現,可以重寫父類的方法。 ⑤重寫從父類繼承過來的方法的三種情況: 《1》完全以子類的實現內容為主,丟棄父類實現的內容 《2》完全以父類的實現內容為主,沒有子類實現的內容 《3》既有父類對該方法的實現,也有子類對該方法的實現 ⑥繼承中方法的執行 《1》查找本類中是否實現(重寫)study方法 《2》如果沒有,查找父類中study是否實現 《3》逐級向上查找,找到即執行 《4》如果NSObject也沒實現,會拋出異常,引起Crash ⑦子類定義了除父類中公共實例變數之外的實例變數 2.super(不是指針) ①作用:給super發消息,可以執行父類該方法的實現 3.self(指針) ①系統關鍵字。self在方法中指代當前方法的調用者 ②self在實例方法中,指代調用當前方法的對象 ③self在類方法中,指代當前類 4.初始化方法 ①初始化方法的主要作用是:為某些實例變數賦初值 ②初始化方法在對象的整個生命周期里只使用一次 註:初始化方法是在對象的初始化階段完成其實例變數的賦值操作,一個對象的初始化階段只有一次,所以初始化方法只使用一次。 示例: 聲明.h - (instancetype)initWithName:(NSString *)name; 實現.m - (instancetype)initWithName:(NSString *)name Age:(NSInteger)age Score:(CGFloat)score{
if (self = [super init]) {
_name = name;
_age = age;
_score = score;
}
return self; } ③在自身的初始化方法中,優先向super發送init消息,初始化公共變數,初始化成功之後,再初始化自身特有變數,從而完成實例變數的初始化。 ④初始化方法特征 《1》初始化方法是“-”實例方法 《2》id或instancetype類型的返回值 《3》以int開頭 《4》可以帶0到多個參數 ⑤內部實現:先執行super的初始化方法,再初始化自身變數,後return self ⑥初始化過程: 《1》使用super調用父類的初始化方法,用於初始化繼承自父類的實例變數 《2》初始化完成之後會返回一個地址,這個地址就是對象的地址 《3》self是一個指針,指向自己的對象。self保存返回的地址 《4》返回值有可能為空。如果返回值為空,就什麼也不做。返回值不為空,初始化自己的實例變數 5.指定初始化方法 ①一個類可以有多個初始化方法 ②雖然可以有多個初始化方法,但是一個對象只能使用一個初始化方法 ③指定初始化方法:無論調用哪一個初始化方法都會調用的初始化方法 ④通常會把在初始化時想做的操作全部放到指定初始化方法中,這樣就無需再每一個初始化方法中都要寫一遍,簡化代碼,方便在後期維護 ⑤選取原則:一般選參數最多的初始化方法作為指定初始化方法 示例: 聲明.h - (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithName:(NSString *)name Age:(NSInteger)age;
- (instancetype)initWithName:(NSString *)name Age:(NSInteger)age Score:(CGFloat)score; 實現.m - (instancetype)initWithName:(NSString *)name Age:(NSInteger)age Score:(CGFloat)score{
if (self = [super init]) {
_name = name;
_age = age;
_score = score;
}
return self;
}
- (instancetype)initWithName:(NSString *)name Age:(NSInteger)age{
//凡是基本數據類型填0,對象、類填nil
return [self initWithName:name Age:age Score:0];
}
- (instancetype)initWithName:(NSString *)name{
return [self initWithName:name Age:0 Score:0]; } 6.便利構造器 ①封裝了對象創建過程 內部實現:封裝了alloc和初始化操作,創建對象更加方便 ②實現方法 《1》是“+”類方法 《2》返回本類型的實例 《3》方法名以類名開頭 《4》可以有0到多個參數 示例: 聲明.h + (id)personWithName:(NSString *)name gender:(NSString *)gender; 實現.m + (id)personWithName:(NSString *)name gender:(NSString *)gender { return [[Person alloc] initWithName:name gender:gender]; } 調⽤ Person *per = [Person personWithName:@"Frank" gender:@"男"];