前言
在寫 iOS 代碼的時候,怎么樣去 new 一個新對象出來,都有一些講究在里面。使用不同的姿勢去創建對象,對后期維護所造成的影響會存在細微的差別。
init 創建
在之前一篇分析 iOS 代碼耦合的文章中,提到過當我們給一個對象的 property 賦值的時候,通過 init 方法傳入參數來初始化 property 會讓我們的代碼更可靠。
有些人在定義帶 property 的 class 的時候,會這樣定義:
@interface User : NSObject@property (nonatomic, strong) NSNumber* userID;@end
使用的時候如下:
User* user = [[User alloc] init];user.userID = @1000;
尤其是在定義 model 的時候,很容易寫出這種,先 init,而后挨個給 property 賦值的代碼。這種代碼的問題在于 property 對于外部是可寫的,property 處于隨時可能變化的狀態。之前不少篇文章中都強調過 immutable 的重要性,同樣對于一個 class,我們也應該優先考慮設計成 immutable 的。
initWith 創建
如果將 property 都設置成 readonly 的,或者不暴露 property,property 的賦值都通過 initWith 的方式來初始化,就可以得到一個具備 immutable 的 class 定義了,具體到上面的例子代碼如下:
//User.h@interface User : NSObject@property (nonatomic, strong, readonly) NSNumber* userID;- (instancetype)initWithUserID:(NSNumber*)uid;@end //User.m@implementation User- (instancetype)initWithUserID:(NSNumber*)uid { self = [super init]; if (!self) { return nil; } _userID = uid; return self;}@end
userID 在 .h 文件當中是 readonly 的,userID 只有一次被賦值的機會,即在 User 的 initWith 方法中。這種方式的好處是一旦 User 對象創建完畢之后,就處于 immutable 的狀態,property 都是不可修改的,安全可靠。
Designated initializer
Apple 為了方便開發者使用 init 方法,引入了一種名為 designated initializer 的 pattern。主要用來管理當一個 class 擁有多個 property 需要賦值的場景。比如上面我們的 User 類:
@interface User : NSObject@property (nonatomic, strong, readonly) NSNumber* userID;@property (nonatomic, strong, readonly) NSString* userName;@property (nonatomic, strong, readonly) NSString* signature;@end
有些場景需要初始化 userID 和 userName,而有些場景只需要初始化 userID 和 signature,所以我們需要提供多個 initWith 方法給不同的場景使用。為了管理 initWith 方法,Apple 將 init 方法分為兩種類型:designated initializer 和 convenience initializer (又叫 secondary initializer) 。
designated initializer 只有一個,它會為 class 當中每個 property 都提供一個初始值,是最完整的 initWith 方法。convenience initializer 則可以有很多個,它可以選擇只初始化部分的 property。convenience initializer 最后到會調用到 designated initializer,所以 designated initializer 也可以叫做 final initializer。
無論我們定義何種類型的 class,給 class 中的每個 property 都賦予一個初始值是個很好的習慣,可以避免掉一些意外的 bug 產生,這也是 designated initializer 的重要職責。
在實際的項目當中,一個 class 的 property 數目可能會隨著業務的增長而增加,最后的結果就是會生成越來越多的 convenience initializer。上述的 User 類,如果是 3 個 property,極端的情況下最多可以有 7 個 init 方法。Peak君在閱讀代碼的時候,也確實看到過有些 class 定義了一連串整整齊齊擺放的 init 方法,代碼雖然看著規范,但顯得亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲а∨天堂久久精品喷水| 国产精品日韩在线观看| 色久欧美在线视频观看| 97在线视频免费观看| 国产伦精品一区二区三区精品视频| 国产精品视频资源| 国产精品va在线播放| 国产美女精彩久久| 欧美电影在线免费观看网站| 久久伊人精品一区二区三区| 在线一区二区日韩| 亚洲人成电影在线观看天堂色| 国产精品成人久久久久| 精品日韩美女的视频高清| 欧美高清视频在线| 在线日韩第一页| 成人国产精品av| 91精品视频免费| 亚洲精品成a人在线观看| 欧美伦理91i| 国产成人精品一区| 亚洲**2019国产| 日韩国产在线播放| 欧美黑人一区二区三区| 亚洲电影免费观看| 国模精品一区二区三区色天香| 91精品国产91久久久久久吃药| 插插插亚洲综合网| 日韩毛片在线看| 久久中文久久字幕| 久久69精品久久久久久国产越南| 久久人体大胆视频| 亚洲欧美一区二区三区久久| 日韩精品在线观看一区二区| 91久久久久久久久| 精品视频一区在线视频| 日韩精品高清在线观看| 精品国产网站地址| 成人性教育视频在线观看| 欧美国产一区二区三区| 日韩高清电影免费观看完整| 亚洲国产精品小视频| 国产成人精品av| 狠狠久久五月精品中文字幕| 久久久亚洲成人| 成人免费视频xnxx.com| 国内伊人久久久久久网站视频| 国产亚洲精品久久久久久牛牛| 亚洲成人精品视频| 亚洲第一精品夜夜躁人人躁| 欧美午夜宅男影院在线观看| 亚洲国产精品va在线看黑人| 欧美日韩国产va另类| 日产日韩在线亚洲欧美| 久久精品在线视频| 亚洲欧美成人精品| 美日韩在线视频| www.欧美三级电影.com| 亚洲成色999久久网站| 一本色道久久88亚洲综合88| 日韩视频免费看| 欧美性xxxxxx| 欧美又大粗又爽又黄大片视频| 亚洲一区中文字幕在线观看| 亚洲精品久久久久久久久| 国产精品久久久久久久久免费| 日韩中文字幕网站| 丝袜亚洲另类欧美重口| 视频在线观看99| 91精品久久久久久久久久入口| 欧美激情videoshd| 91亚洲精品视频| 成人做爰www免费看视频网站| 久热99视频在线观看| 免费av一区二区| 欧美一级视频在线观看| 欧美日韩国产中文精品字幕自在自线| 亚洲天堂免费在线| 国产精品扒开腿做爽爽爽男男| 日本三级韩国三级久久| 色偷偷偷综合中文字幕;dd| 98视频在线噜噜噜国产| 亚洲精品久久久一区二区三区| 欧美主播福利视频| 91国产高清在线| 国产999精品久久久影片官网| 亚洲丝袜av一区| 久久九九热免费视频| 亚洲国产第一页| 亚洲电影在线观看| 亚洲人成网站999久久久综合| 国产欧美精品日韩精品| 国产成人在线亚洲欧美| 亚洲伊人一本大道中文字幕| 国产精品日韩在线一区| 久热在线中文字幕色999舞| 国产一区香蕉久久| 欧美—级a级欧美特级ar全黄| www.欧美视频| 欧美性精品220| 成人国产在线激情| 日本不卡视频在线播放| 国产精品久久久久久一区二区| 97免费在线视频| 国产精品青青在线观看爽香蕉| 成人激情黄色网| 一个色综合导航| 亚洲精选在线观看| 九色精品美女在线| 日韩欧美成人网| 精品久久久久久中文字幕| 欧美成人免费视频| 久久国产精品电影| 国产脚交av在线一区二区| 日韩精品福利在线| 欧美在线播放视频| 国产日韩中文在线| 国产在线一区二区三区| 韩国19禁主播vip福利视频| 亚洲裸体xxxx| 国产91精品久久久久久| 亚洲精品电影久久久| 精品国产乱码久久久久久婷婷| 97色在线观看| 日韩久久免费视频| 亚洲级视频在线观看免费1级| 日韩中文字幕亚洲| 欧美成人在线免费视频| 91精品国产亚洲| 国产精品久久久久久久久久三级| 欧美亚洲免费电影| 91av视频在线| 欧美日韩国产在线播放| 成年人精品视频| 国产精品久久一| 亚洲人免费视频| 国模gogo一区二区大胆私拍| 国产精品视频精品视频| 国产精品视频专区| 亚洲欧美在线一区| 成人日韩av在线| 欧美视频在线免费| 日本国产精品视频| 久久韩国免费视频| 在线亚洲国产精品网| 日韩精品免费在线视频| 国内免费精品永久在线视频| 亚洲精品美女在线观看播放| 日本道色综合久久影院| 欧美诱惑福利视频| 欧美精品在线第一页| 国产成人精彩在线视频九色| 国外日韩电影在线观看| 日韩美女中文字幕| 国产精品无av码在线观看| 中文字幕亚洲综合久久| 91影视免费在线观看| 亚洲石原莉奈一区二区在线观看| 欧美亚洲免费电影| 国产亚洲成av人片在线观看桃| 亚洲人成在线播放| 亚洲成人av片| 久久精品成人一区二区三区| 成人免费看吃奶视频网站|