第三章 接口與API設(shè)計(jì)(EffectiveObjective-C)

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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魂仍,死亡現(xiàn)場離奇詭異,居然都是意外死亡拣挪,警方通過查閱死者的電腦和手機(jī)擦酌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來菠劝,“玉大人赊舶,你說我怎么就攤上這事「险铮” “怎么了笼平?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舔痪。 經(jīng)常有香客問我寓调,道長,這世上最難降的妖魔是什么锄码? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任夺英,我火速辦了婚禮鸠珠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秋麸。我一直安慰自己,他們只是感情好炬太,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布灸蟆。 她就那樣靜靜地躺著,像睡著了一般亲族。 火紅的嫁衣襯著肌膚如雪炒考。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天霎迫,我揣著相機(jī)與錄音斋枢,去河邊找鬼。 笑死知给,一個胖子當(dāng)著我的面吹牛瓤帚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涩赢,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼戈次,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筒扒?” 一聲冷哼從身側(cè)響起怯邪,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎花墩,沒想到半個月后悬秉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡冰蘑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年和泌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祠肥。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡允跑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出搪柑,到底是詐尸還是另有隱情聋丝,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布工碾,位于F島的核電站弱睦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏渊额。R本人自食惡果不足惜况木,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一垒拢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧火惊,春花似錦求类、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惶岭,卻和暖如春寿弱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背按灶。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工症革, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸯旁。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓噪矛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铺罢。 傳聞我的和親對象是個殘疾皇子摩疑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容