一. 繼承
面向對象語言的三大特征: 封裝 繼承 多態
繼承的特點:即保證了類的完整性,又簡化了代碼,一定程度上消除了代碼冗余.
把公共的方法與實例變量寫在父類中,子類只需要寫自己獨有的實例變量方法.
@interface A : B
//類成員變量,成員方法,getter,setter聲明
@end
@implementation A
//類成員變量,成員方法,getter,setter,定義.
@end
即A繼承于B,A是B的子類,B是A的父類.
沒有父類的類稱為根類,例如祖宗:NSObject.并且繼承是單向的,不能進行多繼承.
但是,一個類可以有多個超類. 繼承有傳遞性.
A繼承于B,B繼承于C,即A有C的特性.如果子類不滿意父類的方法,可以重寫(overwrite)父類的方法.
二. super ?self
super關鍵字,為編譯器指令,即執行父類的方法.
[super init]即執行父類的初始化方法.
OC中的方法調用采用消息發送機制[receiver message]
例如找類生成對象調用類的成員方法時,首先在自己的類中尋找,若沒有,則在父類中尋找,依次向上,直到NSObject即允許,若沒找到則會拋出異常,引起Crash.
self類似與一個指向對象的指針.類似于Java中的this.
在繼承中,如果子類不滿意父類的方法實現,可以再子類當前的實現部分重寫父類繼承來的方法.在方法調用時,優先從對象對應類中查找方法的實現,如果不存在該方法,則依次查找父類的實現并執行.如果是重寫父類實現,則只需要在當前類的m文件中重寫方法實現即可.不需要在h文件中再聲明該方法.
三. 初始化方法
初始化的步驟:1.為對象開辟空間 ? ?2.進行初始化操作.
初始化方法的主要作用是:為某些實例變量賦初值.
初始化對象在對象的整個生命周期里只使用一次.
一個對象的初始階段只有一次,所以初始化方法只使用一次.
- (id)init {
//給super發送init消息:執?行?父類中實現的init?方法
self= [super init];//判斷從?父類繼承過來的init?方法是否初始化成功
if(self != nil) {//nil的意思為空對象
//初始化設置}
//返回初始化完成的對象
return self;
}
?類定義了除父類中公共實例變量之外的實例變量。
在?自?身的初始化?方法中,優先向????supe??r發送init??消息,初始化公共變量,
初始化成功之后,再初始化?身特有變量,從?完成全部實例變量的初始化。
self為系統關鍵字指的是當前方法的調用者,
self在實例方法中,指代調用當前方法的對象,
self在類方法中,指代當前類.
self是一個系統關鍵字,也是一個指針,在實例方法內部是一個const類型的指針,在實例方法內部,self指代的時當前正在調用該方法的實例對象本身.
初始化的方法為-方法,返回值類型為id或者instancetype類型,以init開頭,可以帶0至多個參數.
id類型為void *類型,也就是泛型.
instancetype類型只能做為返回值,而id可以作為參數,也可作為返回值.使用instancetype類型作為返回值時,可以提高代碼的可讀性.
上述初始化代碼,即先執行super的初始化方法,在進行自身變量初始化,然后return self.
自己在初始化過程中,優先調用父類的初始化方法,在依次調用超類的初始化方法.直到本類的初始化完成.
四. 指定初始化方法
類中有3個實例變量,即為有一個最全的指定初始化方法.
//Test.h文件中定義
@interface ?Test : NSObject
{
NSString *_name;
NSString *_age;
}
//setter
- (void)setName:(NSString *)name
age:(NSString *)age;
//getter
- (NSString *)name;
- (NSString *)age;
//指定初始化
- (instancetype)initWithName:(NSString *)name
age:(NSString *)age;
@end
//Test.m文件中實現
@implementation Test
//setter
- (void)setName:(NSString *)name
? ? ? ? ? ? ? ? ? ?gender:(NSString *)gender{
_name = name;
_gender = gender;
}
//指定初始化
- (instancetype)initWithName:(NSString *)name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? age:(NSString *)gender {
self = [super init];
if (self) {
_name = name;
_gender = gender;
}
return self;
}
//getter
- (NSString *)name {
return _name;
}
- (NSString *)gender {
return _gender;
}
@end
五. 便利構造器
便利構造器為"+"號方法,方法名以類名開頭
//聲明
+ (instancetype)testName:(NSString *)name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gender:(NSString *)gender;
//實現
+ (instancetype)testName:(NSString *)name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gender:(NSString *)gender {
return [[self alloc] initWithName:name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? gender:gender];
}