參考鏈接理解 Objective-C 中的指定構造方法 - 簡書
問題1:NS_DESIGNATED_INITIALIZER是什么?
這個NS_DESIGNATED_INITIALIZER是一個宏。代替的是runtime中的一個東西。
問題2:他的作用是什么?
對于多個構造方法,它可以指定一個基礎的構造方法。其它快捷的構造方法都必須通過它來實現類的初始化。代碼規范的一種。可以避免不必要的bug。良好的編程習慣。
問題3:使用方法?
將它加在你固定的通指定造方法的后面。(頭文件中)
問題4:注意事項?
指定構造方法需要先調用父類的指定構造方法,然后再對自身類的屬性進行初始化。
如果子類的指定構造t方法與父類不同,則該子類需要覆寫父類的指定構造方法,并在該實現里面調用自身的指定構造方法。
??1:自定義view,并指定一個構造方法的代碼
@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是平行的。所以他的實現要直接寫正常的初始化方式。
但是由于沒有調用自定義類的指定初始化方法。所以編譯器會報警告。
Convenience initializer missing a 'self' call to another initializer
大意為你使用了非指定初始化方法之外的方法。不影響正常使用。
以下的代碼會消除相應的警告 #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;
}
??中的注意事項:UIView有兩個指定構造方法,都需要重寫。