iOS 指定初始化方法

級別: ★☆☆☆☆
標(biāo)簽:「NS_DESIGNATED_INITIALIZER 」「NS_UNAVAILABLE」「iOS指定初始化方法」
作者: WYW
審校: QiShare團(tuán)隊


前言:筆者最近了解了部分SDK開發(fā)相關(guān)的內(nèi)容校赤,在涉及指定視圖控制器(下文用VC代指視圖控制器)的初始化方法的時候,遇到了一些問題筒溃。這里筆者給大家分享下設(shè)置方法马篮,如有不同見解,敬請指教怜奖。

筆者遇到的問題如下:

筆者希望 使用SDK的業(yè)務(wù)能夠使用 SDK中確定的初始化VC的方法浑测;
下邊筆者以需要傳入VC的導(dǎo)航欄標(biāo)題并初始化相應(yīng)VC為例,來闡明相關(guān)問題歪玲。
對于上述情況迁央,有多種處理方式,如:

  1. 在SDK暴露的頭文件中滥崩,文字說明岖圈,用哪個初始化方法;在文檔中說明钙皮, 用哪個初始化方法蜂科;在提供的Demo中,寫明相應(yīng)地示例代碼短条。
  2. 利用系統(tǒng)給的宏NS_DESIGNATED_INITIALIZER指定vc初始化方法
    指定初始化方法部分导匣,可以使用宏NS_DESIGNATED_INITIALIZER指定,那么如果業(yè)務(wù)沒有看SDK頭文件茸时,直接使用new 或者 alloc init的方式指定初始化方法贡定,那么我們初始化VC所需的導(dǎo)航欄標(biāo)題就不能得以正常傳入。

對于這種情況可都,我們可以提供如下3種方法:

  1. 把不想業(yè)務(wù)使用的初始化方法缓待,使用系統(tǒng)宏 NS_UNAVAILABLE 把相應(yīng)初始化方法設(shè)置為不可用;如禁用new 汹粤,這樣的效果是:業(yè)務(wù)如果想使用new 初始化VC命斧,會發(fā)現(xiàn)有錯誤提示田晚,使用這種方法比較簡單嘱兼。
  1. 對于不想業(yè)務(wù)使用的初始化方法,在實現(xiàn)文件中贤徒,實現(xiàn)相應(yīng)的方法芹壕,并且給予默認(rèn)值汇四。比如說對于初始化VC的導(dǎo)航欄標(biāo)題的情況,給定默認(rèn)標(biāo)題為defaultNavigationTitle踢涌。不過這種初始化方法通孽,不適用傳入重要參數(shù)的情況,不然業(yè)務(wù)會覺得怪怪的睁壁。另外這種方式背苦,以后如果有相關(guān)改動,可能改動代碼會較多潘明。
  1. 對于不想業(yè)務(wù)使用的初始化方法行剂,在實現(xiàn)文件中,實現(xiàn)相應(yīng)的方法钳降,并且拋出崩潰厚宰,并且指定崩潰原因,在崩潰原因中說明應(yīng)該使用的初始化VC的方法遂填。對于這種方式铲觉,如果以后有改動,可能改動代碼會較多吓坚。
    相比如上三種處理方式撵幽,筆者更傾向于使用第一種,如果你有其他見解礁击,歡迎討論并齐。

下邊我們?nèi)砸猿跏蓟疺C時,指定傳入導(dǎo)航欄標(biāo)題為例客税,貼上相關(guān)的示例代碼况褪。

第一種方式:

// .h 文件

- (instancetype)initWithSomething:(id)someThing NS_DESIGNATED_INITIALIZER;

- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
// .m 文件

/*! @brief 導(dǎo)航欄title */
@property (nonatomic, copy) NSString *navTitle;


- (instancetype)initWithSomething:(id)someThing {
    // Cannot assign to 'self' outside of a method in the init family
    // 指定初始化方法需要以 1. init開頭 2. 并且init后邊緊挨著地字母是大寫的
    self = [super initWithNibName:nil bundle:nil];
    if (!self) {
        return nil;
    }
    _navTitle = someThing;
    [self commonInit];
    return self;
}

- (void)commonInit {
    
    self.navigationItem.title = _navTitle;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
}

第二種方式:

.h
- (instancetype)initWithSomething:(id)someThing;

// .m 文件

/*! @brief 導(dǎo)航欄title */
@property (nonatomic, copy) NSString *navTitle;


- (instancetype)initWithSomething:(id)someThing {
    
    self = [super init];
    if (!self) {
        return nil;
    }
    _navTitle = someThing;
    return self;
}

- (instancetype)init {
    
    self = [super init];
    if (!self) {
        return nil;
    }
    [self commonInit];
    return self;
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (!self) {
        return nil;
    }
    [self commonInit];
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    self = [super initWithCoder:aDecoder];
    if (!self) {
        return nil;
    }
    [self commonInit];
    return self;
}

- (void)commonInit {
    
    _navTitle = @"Default";
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = _navTitle;
    self.view.backgroundColor = [UIColor whiteColor];
}

第三種方式:

// .h 文件
- (instancetype)initWithSomething:(id)someThing;

// .m 文件
static NSString *const kExceptionName = @"初始化方法有誤";
static NSString *const kExceptionReason = @"請使用initWithSomething:進(jìn)行初始化";

/*! @brief 導(dǎo)航欄title */
@property (nonatomic, copy) NSString *navTitle;


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = _navTitle;
    self.view.backgroundColor = [UIColor whiteColor];
}

+ (instancetype)new {
    
    @throw [[self class] initExceptioin];
    return nil;
}

- (instancetype)init {
    
    @throw [[self class] initExceptioin];
    return nil;
}

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    
    @throw [[self class] initExceptioin];
    return nil;
}

- (instancetype)initWithSomething:(id)someThing {
    
    self = [super init];
    if (!self) {
        return nil;
    }
    _navTitle = someThing;
    
    return self;
}

+ (NSException *)initExceptioin {
    
    return [NSException exceptionWithName:kExceptionName reason:kExceptionReason userInfo:nil];
}

Demo:

Demo:QiDesignatedInitializer

參考學(xué)習(xí)網(wǎng)址


推薦文章:
UIView中的hitTest方法
iOS關(guān)于tabBar的幾處筆記
A的女兒是B的女兒的媽媽,A是B的誰更耻?
算法小專欄:選擇排序
iOS Runloop(一)
iOS 常用調(diào)試方法:LLDB命令
iOS 常用調(diào)試方法:斷點
iOS 常用調(diào)試方法:靜態(tài)分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末测垛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子秧均,更是在濱河造成了極大的恐慌食侮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件目胡,死亡現(xiàn)場離奇詭異锯七,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)誉己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門眉尸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事噪猾∶够觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵袱蜡,是天一觀的道長丝蹭。 經(jīng)常有香客問我,道長坪蚁,這世上最難降的妖魔是什么奔穿? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮敏晤,結(jié)果婚禮上巫橄,老公的妹妹穿的比我還像新娘。我一直安慰自己茵典,他們只是感情好湘换,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著统阿,像睡著了一般彩倚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扶平,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天帆离,我揣著相機(jī)與錄音,去河邊找鬼结澄。 笑死哥谷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麻献。 我是一名探鬼主播们妥,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勉吻!你這毒婦竟也來了监婶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤齿桃,失蹤者是張志新(化名)和其女友劉穎惑惶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體短纵,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡带污,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了香到。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鱼冀。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡报破,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雷绢,到底是詐尸還是另有隱情,我是刑警寧澤理卑,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布翘紊,位于F島的核電站,受9級特大地震影響藐唠,放射性物質(zhì)發(fā)生泄漏帆疟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一宇立、第九天 我趴在偏房一處隱蔽的房頂上張望踪宠。 院中可真熱鬧,春花似錦妈嘹、人聲如沸柳琢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柬脸。三九已至,卻和暖如春毙驯,著一層夾襖步出監(jiān)牢的瞬間倒堕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工爆价, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留垦巴,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓铭段,卻偏偏與公主長得像骤宣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子序愚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354