構(gòu)造方法
重寫init方法
- 想在對象創(chuàng)建完畢后飞袋,成員變量馬上就有一些默認的值就可以重寫init方法
- 重寫init方法格式:
- (id)init {
self = [super init];
if (self) {
// Initialize self.
}
return self;
}
- [super init]的作用:
- 面向?qū)ο蟮捏w現(xiàn),先利用父類的init方法為子類實例的父類部分屬性初始化润匙。
- self 為什么要賦值為[super init]:
- 簡單來說是為了防止父類的初始化方法release掉了self指向的空間并重新alloc了一塊空間蒜鸡。還有[super init]可能alloc失敗,這時就不再執(zhí)行if中的語句。
構(gòu)造方法使用注意
-
子類擁有的成員變量包括自己的成員變量以及從父類繼承而來的成員變量,在重寫構(gòu)造方法的時候應該首先對從父類繼承而來的成員變量先進行初始化荠呐。
- 原則:先初始化父類的,再初始化子類的挥吵。
- 先調(diào)用父類的構(gòu)造方法[super init];
- 再進行子類內(nèi)部成員變量的初始化。
- 原則:先初始化父類的,再初始化子類的挥吵。
千萬不要把
self = [super init]
寫成self==
[super init]重寫構(gòu)造方法的目的:為了讓對象方法一創(chuàng)建出來,成員變量就會有一些固定的值祭椰。
instancetype的作用
- instancetype與id相似臭家,不過instancetype只能作為方法返回值,它會進行類型檢查方淤,如果創(chuàng)建出來的對象钉赁,賦值了不相干的對象就會有一個警告信息,防止出錯携茂。
// init此時返回值是id
NSString *str = [[Person alloc] init];
// Person并沒有l(wèi)ength方法, 但是id是動態(tài)類型, 所以編譯時不會報錯
NSLog(@"length = %i", [str length]);
// init此時返回值是instancetype
// 由于instancetype它會進行類型檢查, 所以會報警告
NSString *str = [[Person alloc] init];
NSLog(@"length = %i", [str length]);
instancetype *p = [[person alloc] init];
// 錯誤寫法instancetype只能作為返回值
自定義構(gòu)造方法
有時候僅僅靠重寫構(gòu)造方法(初始化方法)你踩,不能滿足需求。比如一個班級中不可能所有學生的年齡都一樣讳苦,這時候我們需要在創(chuàng)建某個學生的時候能夠傳入這個學生的年齡带膜。這時候就需要來自定義構(gòu)造函數(shù)(初始化函數(shù))
-
自定義構(gòu)造方法的規(guī)范
- (1)一定是對象方法,以減號開頭
- (2)返回值一般是instancetype類型
- (3)方法名必須以initWith開頭
示例
@interface Person : NSObject
@property int age;
@property NSString *name;
// 當想讓對象一創(chuàng)建就擁有一些指定的值,就可以使用自定義構(gòu)造方法
- (id)initWithAge:(int)age;
- (id)initWithName:(NSString *)name;
- (id)initWithAge:(int)age andName:(NSString *)name;
@end
自定義構(gòu)造方法的使用注意
(1)自己做自己的事情
(2)父類的屬性交給父類的方法來處理,子類的方法處理子類自己獨有的屬性
自定義構(gòu)造方法必須以intiWith開頭,并且’W’必須大寫
OC中執(zhí)行方法的查找順序
-
1.給實例對象發(fā)送消息的過程(調(diào)用對象方法)
- 根據(jù)對象的isA指針去該對象的類方法中查找,如果找到了就執(zhí)行
- 如果沒有找到医吊,就去該類的父類類對象中查找
- 如果沒有找到就一直往上找钱慢,直到跟類(NSObject)
- 如果都沒有找到就報錯
-
2.給類對象發(fā)送消息(調(diào)用類方法)
- 根據(jù)類對象的isA指針去元對象中查找,如果找到了就執(zhí)行
- 如果沒有找到就去父元對象中查找
- 如果如果沒有找到就一直往上查找卿堂,直到根類(NSOject)
- 如果都沒有找到就報錯