參考鏈接理解 Objective-C 中的指定構(gòu)造方法 - 簡(jiǎn)書
問題1:NS_DESIGNATED_INITIALIZER是什么系谐?
這個(gè)NS_DESIGNATED_INITIALIZER是一個(gè)宏道伟。代替的是runtime中的一個(gè)東西睛挚。
問題2:他的作用是什么篮灼?
對(duì)于多個(gè)構(gòu)造方法棚辽,它可以指定一個(gè)基礎(chǔ)的構(gòu)造方法兢孝。其它快捷的構(gòu)造方法都必須通過它來實(shí)現(xiàn)類的初始化。代碼規(guī)范的一種睬捶∏穑可以避免不必要的bug。良好的編程習(xí)慣擒贸。
問題3:使用方法臀晃?
將它加在你固定的通指定造方法的后面。(頭文件中)
問題4:注意事項(xiàng)酗宋?
指定構(gòu)造方法需要先調(diào)用父類的指定構(gòu)造方法积仗,然后再對(duì)自身類的屬性進(jìn)行初始化。
如果子類的指定構(gòu)造t方法與父類不同蜕猫,則該子類需要覆寫父類的指定構(gòu)造方法,并在該實(shí)現(xiàn)里面調(diào)用自身的指定構(gòu)造方法哎迄。
??1:自定義view回右,并指定一個(gè)構(gòu)造方法的代碼
@interface testView : UIView
@property (nonatomic,copy) NSString *name;
-(instancetype)initWithFrame:(CGRect)frame name:(NSString*)name NS_DESIGNATED_INITIALIZER;
@end
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
return [self initWithFrame:CGRectMake(0, 0, 100, 100) name:@""];
}
ps:由于此方法也是view的指定初始化方法。其與frame是平行的漱挚。所以他的實(shí)現(xiàn)要直接寫正常的初始化方式翔烁。
但是由于沒有調(diào)用自定義類的指定初始化方法。所以編譯器會(huì)報(bào)警告旨涝。
Convenience initializer missing a 'self' call to another initializer
大意為你使用了非指定初始化方法之外的方法蹬屹。不影響正常使用。
以下的代碼會(huì)消除相應(yīng)的警告 #pragma clang diagnostic ignored "-Wobjc-designated-initializers"
-(instancetype)initWithFrame:(CGRect)frame{
return [self initWithFrame:CGRectMake(0, 0, 100, 100) name:@""];
}
-(instancetype)initWithFrame:(CGRect)frame name:(NSString*)name? {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor greenColor];
self.name = name;
}
return self;
}
??中的注意事項(xiàng):UIView有兩個(gè)指定構(gòu)造方法白华,都需要重寫慨默。