1 使用前綴避免命名空間沖突
- 命名沖突,應(yīng)用程序鏈接的時(shí)候會報(bào)錯
duplicate symbol _OBJC_METACLASS_$_EOCTheClass in: build/somthing.o
在運(yùn)行期載入了含有重名類的程序庫,"動態(tài)加載"遭遇"重名符號錯誤",會導(dǎo)致程序崩潰 - 不僅是類名,應(yīng)用程序中的所有名稱都應(yīng)加前綴,如果要為既有類新增"分類"(category),那么一定要給"分類"及"分類"中的方法加上前綴
- 如果用第三方庫編寫自己的代碼,并準(zhǔn)備將其發(fā)布為程序庫供其他人開發(fā)應(yīng)用程序所用.
這是應(yīng)該給你所用的那一份第三非苦代碼加上你自己的前綴.
例如:你準(zhǔn)備發(fā)布的程序庫叫做EOCLibrary.
2 提供"全能初始化方法"
為對象提供必要信息以便其完成工作的初始化方法叫做"全能初始化方法"
如 UITableViewCell
,在初始化該類對象時(shí),需要指明其樣式以及標(biāo)識符
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier
如果創(chuàng)建類實(shí)例的方式不止一個,那么這個累就會有很多個初始化方法,不過仍然要在其中選定一個作為全能初始化方法,令其他初始化方法都來調(diào)用他
好處:當(dāng)?shù)讓訑?shù)據(jù)存儲機(jī)制改變時(shí),只需修改此方法的代碼就好,無須改變其他初始化方法
3 現(xiàn)實(shí)description方法
description
:在NSObject協(xié)議中,自定義NSLog方法返回的字符串
debugDescription
:在NSObject協(xié)議中,自定義在控制臺通過po命令輸出的的字符串
4 盡量使用不可變對象
- 設(shè)計(jì)類的時(shí)候,應(yīng)充分應(yīng)用屬性來封裝數(shù)據(jù),而在使用屬性時(shí),則可將其聲明為"只讀"(read-only).
默認(rèn)情況屬性是"可讀可寫"(read-write).這樣設(shè)計(jì)出來的類是"可變的".
在編程實(shí)踐中,則應(yīng)該盡量把對外公布出來的屬性設(shè)為只讀,而且只在確有必要時(shí)才將屬性對外公布
@interface EOCPointOfInterest : NSObject @property (nonatomic, copy,readonly) NSString *indentifier; @property (nonatomic, copy,readonly) NSString *title; @end
- 有時(shí)可能想要修改封裝在對象內(nèi)部的數(shù)據(jù),但是卻不想令這些數(shù)據(jù)為外人所改動.這個時(shí)候,通常做飯是在對象內(nèi)部將
readOnly
屬性重新什么為readwrite
,當(dāng)然屬性是nonatomic
的,那么這樣做可能會產(chǎn)生"競爭條件"(race condition).可以通過"派發(fā)隊(duì)列"等手段,講數(shù)據(jù)存取設(shè)為同步操作
#import "EOCPointOfInterest.h" @interfaceEOCPointOfInterest () @property (nonatomic, copy,readwrite) NSString *indentifier; @property (nonatomic, copy,readwrite) NSString *title; @end @implementation EOCPointOfInterest @end
- 不要把可變的
collection
作為屬性公開,而應(yīng)該提供相關(guān)方法,以此修改對象中的可變collection
Person
有個friends
的集合屬性
@interface Person : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, strong,readonly) NSSet *friends; - (void)addFriend:(Person*)person; - (void)removeFriend:(Person*)person; @end @implementation Person{ NSMutableSet *_internalFriends; } - (NSSet *)friends{ return [_internalFriendscopy]; } - (void)addFriend:(Person *)person{ [_internalFriendsaddObject:person]; } - (void)removeFriend:(Person *)person{ [_internalFriendsremoveObject:person]; } @end
5 使用清晰而協(xié)調(diào)的命名方式
方法與變量名使用"駝峰式大小寫命名法",變量名小寫字母開頭,其后每個單詞首字母大寫
類名首字母要大寫,其后每個單詞首字母大寫.
5.1 方法命名
- 如果方法的返回值是新創(chuàng)建的,那么方法名的首個詞應(yīng)該是返回值類型,除非前面還有修飾語
- 應(yīng)該把標(biāo)識參數(shù)類型的名詞放在參數(shù)前面
- 如果方法要在當(dāng)前對象上執(zhí)行操作,那么就應(yīng)該包含動詞,若執(zhí)行操作時(shí)還需要參數(shù),則應(yīng)該在動詞
后面加上一個或多個名詞 - 不要使用str這種簡稱,應(yīng)該用string這樣的全稱
- Boolean屬性應(yīng)加is當(dāng)前綴.如果某方法返回非屬性的Boolean值,那么應(yīng)該根據(jù)其功能選用
has或is做前綴 - 將get這個前綴留給哪些借由"輸出參數(shù)"來保存返回值的方法.
5.2 類與協(xié)議的命名
應(yīng)該為類與協(xié)議的名稱加上前綴,以避免命名控件沖突
6 為私有方法名加前綴
- 一個類所做的事情通常都要比從外面看到的更多,編寫類的實(shí)現(xiàn)代碼時(shí),經(jīng)常要寫一些只有內(nèi)部使用
的方法,建議為這種方法的名稱加上某些前綴, 這樣有助于調(diào)試, 這樣能很容易把公共與私有方法分開 - 為私有方法添加前綴的好處二:修改其名稱或簽名之前要三思,公共API不便輕易改動(影響面廣)
- 具體使用何種前綴根據(jù)個人喜好,其中最好包含下劃線與字母, 如p_作為前綴
@interface EOCObject : NSObject - (void)publicMethod; @end @implementation EOCObject - (void)publicMethod{} - (void)p_privateMthod{} @end
- 不要單用一個下劃線做私有方法的前綴,因?yàn)檫@種做法是預(yù)留給蘋果的
7 理解Objective-C 錯誤類型
7.1 Objective-C:只在極其嚴(yán)重的錯誤下拋出異常,拋出異常之后,無需考慮回復(fù)問題,而且應(yīng)用程序此時(shí)也應(yīng)該退出
7.2 在非致命錯誤:Objective-C所采用的方式是令方法返回nil/0. 或是使用NSError,以表明其中有錯誤發(fā)生
7.3 NSError對象里封裝了三條消息
- Error domain:錯誤范圍,也就是產(chǎn)生錯誤的根源.類型為字符串,通常用一個特有的全局變量來定義
- Error code:錯誤碼,類型為這個整數(shù).用意指明具體發(fā)生了何種錯誤,通常采用enum來定義
- User info:用戶信息,類型為字典,關(guān)于錯誤的額外描述,包含一段"本地化描述"
NSError第一種常見用法就是通過協(xié)議,來傳遞錯誤.有錯誤發(fā)生時(shí),當(dāng)前對象會把錯誤信息經(jīng)由協(xié)議中的某個方法傳遞給委托對象(delegate)
NSError第二種常見用法:經(jīng)由方法的"輸出參數(shù)"返回給調(diào)用者.
- (BOOL)doSomething:(NSError *__autoreleasing *)error{ //do somethong that may cause an error if (/*there was an error*/) { if (error) { *error = [NSErrorerrorWithDomain:domaincode:codeuserInfo:userInfo]; } returnNO; } returnYES; }
傳遞給方法的參數(shù)是個指針,而該指針本事又指向另外一個指針,而該指針本身又指向另外一個指針,
那個指針指向NSError對象,或者也可以把他當(dāng)成一個直接指向NSError對象的指針.這樣一來,就可以經(jīng)由
"輸出參數(shù)"把NSError對象傳遞給調(diào)用者
NSError *error=nil; [selfdoSomething:&error];
8 理解NSCoping協(xié)議
如果想自己的類支持拷貝操作,那就要實(shí)現(xiàn)NSCopying
協(xié)議,該協(xié)議只有一個方法
- (id)copyWithZone:(NSZone *)zone;
long long age,會據(jù)此把內(nèi)存分成不同的"區(qū)"(zone),而對象會創(chuàng)建在某個區(qū)里面,現(xiàn)在每個程序只有一個去,
"默認(rèn)區(qū)"(default zone).所以在實(shí)現(xiàn)這個方法的時(shí)候,不用考慮參數(shù)zone.