NS_DESIGNATED_INITIALIZER關鍵字使用

參考鏈接理解 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有兩個指定構造方法,都需要重寫。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容