編寫高質(zhì)量的iOS代碼(四)

用前綴避免命名空間沖突

Objective-C沒有其他語言的內(nèi)置的命名空間(namespace)结序,所以在起名時就要設(shè)法避免 潛在的命名沖突暂殖。如果發(fā)生了naming clash(命名沖突)朝刊,那么程序的鏈接過程就會報錯。

  • 選擇與你公司韭赘、應(yīng)用程序或二者皆有關(guān)聯(lián)的名稱作為類名的前綴,并在所有代碼中均使用這一前綴势就。

Apple宣稱其保留使用所有“兩字母前綴”(two-letter prefix)的權(quán)利泉瞻,也就是說自己選用的前綴應(yīng)該是三個字母。

  • 若自己所開發(fā)的程序庫中用到了第三方庫苞冯,則應(yīng)為其中的名稱加上前綴袖牙。

提供“指定初始化方法”

什么是“指定初始化方法”,就是可謂對象提供必要信息以便其能完成工作的初始化方法舅锄。
??:在初始化UITabableViewCell的時候鞭达,需要指明style以及identifier,用來重復(fù)利用皇忿。

  • 在類中提供一個指定初始化方法畴蹭,并于文檔里指明。其他初始化方法均應(yīng)調(diào)用此方法鳍烁。

如果一個類有多個初始化方法叨襟,不過仍然要在其中選定一個作為指定初始化方法,令其他初始化方法都來調(diào)用它幔荒。NSDate就是個??:

 - (id)init;
 - (id)initWithString:(NSString *)string;
 - (id)initWithTimeIntervalSinceNow:(NSTimeInterval)seconds;
 - (id)initWithTimeInterval:(NSTimeInterval)seconds sinceDate:(NSDate *)refDate;
 - (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)seconds;
 - (id)initWithTimeIntervalSince1970:(NSTimeInterval)seconds;

在上面幾個方法中糊闽,“initWithTimeIntervalSinceReferenceDate:”是指定初始化方法梳玫,換而言之,其余的方法都要調(diào)用它右犹,并且也只有這個方法中才會存儲內(nèi)部數(shù)據(jù)汽纠。這樣做的好處就是,當(dāng)需要改變底層數(shù)據(jù)存儲機制時傀履,只需要修改此方法的代碼就好了虱朵,無須改動其他初始化方法。

  • 若指定初始化方法和父類不同钓账,則需覆寫父類中對應(yīng)的方法碴犬。
  • 如果父類的初始化方法不適用于子類,那么應(yīng)該覆寫這個父類方法梆暮,并在其中拋出異常服协。

實現(xiàn)description方法

  • 實現(xiàn)description方法返回一個有意義的字符串,用以描述該實例啦粹。

在調(diào)試程序時偿荷,經(jīng)常需要打印并查看對象信息,最常用的做法就是:

NSLog(@"object = %@", object);

在構(gòu)建需要打印到日志的字符串時唠椭,object對象會收到desciption消息跳纳,該方法所返回的描述信息將取代“格式字符串”(format string)里的"%@"。??:

NSArray *object = @[@"A string", @(123)];
NSLog(@"object = %@", object);
//output:object = ( "A string", 123 )

但是贪嫂,如果在自定義類上這么做寺庄,輸出的信息卻是這樣的:

object = <MSTPerson: 0x3fd8a1377299>

這個時候就可以通過覆寫description方法來獲取更多的信息,??:


MSTPerson.h

MSTPerson.m

main.m

按照上面的代碼來寫力崇,那么MSTPerson就會出書如下格式的信息:


output

但是這里建議斗塘,在新實現(xiàn)的description方法中,也應(yīng)該像默認(rèn)的實現(xiàn)那樣亮靴,打印出類的名字和地址馍盟。
有個簡單的方法,可以在description中輸出很多互不相同的信息茧吊,那就是借助NSDictionary類的description方法贞岭。
??,下面這個類表示某個地點的名稱和地理坐標(biāo):
MSTLocation.h

MSTLocation.m

main.m

output
  • 若想在調(diào)試時打印出更詳盡的對象描述信息饱狂,則應(yīng)實現(xiàn)debugDescription方法曹步。

都知道在打斷點的地方LLDB的"po"命令可以完成打印工作,而打印出來的內(nèi)容就是所打印的類的debugDescription方法返回的字符串休讳。如果想打印出更具體的指令讲婚,那么只需要像上面的做法一樣,更新debugDescription方法俊柔。
以MSTLocation為??:


output

盡量使用不可變對象

在使用屬性時筹麸,可以將其聲明為readonly活合,但是默認(rèn)的情況下,屬性是readwrite物赶,這樣都是可變的白指。但是一般的情況下,我們要建模的數(shù)據(jù)未必需要改變酵紫。
在具體的編程中告嘲,應(yīng)該盡量把對外公布出來的屬性設(shè)為只讀,而且只在確有必要時才將屬性對外公布奖地。??橄唬,要編寫一個類來處理地圖上的景點,這些點的數(shù)據(jù)通過某個網(wǎng)絡(luò)服務(wù)來獲取参歹。一開始寫出來的代碼也許就是:


MSTPointOfInterest.h

但是這些屬性都是在外部不需要更改的仰楚,所以應(yīng)該這樣寫:


MSTPointOfInterest.h

雖然沒有setter方法,但是仍要指定內(nèi)存管理語義(strong, weak之類)的原因就是這樣做以后更改為readwrite更方便犬庇。

  • 若某屬性僅可用于對象內(nèi)部修改僧界,則在“class-continuation分類”中將其由readonly屬性擴展為readwrite屬性。

如果該屬性是nonatomic的臭挽,這樣做可能會產(chǎn)生“競爭條件”(race condition)捂襟。在對象內(nèi)部寫入某屬性時,對象外的observer也許正在讀取該屬性埋哟。想要避免這個問題笆豁,可以在必要時通過“派發(fā)隊列”(dispatch queue)等手段,將(包括對象內(nèi)部的)所有數(shù)據(jù)存取操作都設(shè)為同步操作赤赊。
??:


MSTPointOfInterest.m

現(xiàn)在,只能在內(nèi)部設(shè)置屬性值了煞赢,但是在外部還是可以通過KVC的方式來設(shè)置這些屬性值抛计。

  • 不要把可變的collection作為屬性公開,而應(yīng)提供相關(guān)方法照筑,以此修改對象中的可變collection吹截。

??:


MSTPerson.m

當(dāng)然也可以用NSMutableSet來實現(xiàn)friends屬性,這樣就可以不借助"addFriend:"和"removeFriends:"方法直接操作凝危。但是這樣過分解耦(decouple)數(shù)據(jù)的做法很容易出bug波俄。
還需要強調(diào)的一點就是:不要在返回的對象上查詢類型以確定其是否可變。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛾默,一起剝皮案震驚了整個濱河市懦铺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌支鸡,老刑警劉巖冬念,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趁窃,死亡現(xiàn)場離奇詭異,居然都是意外死亡急前,警方通過查閱死者的電腦和手機醒陆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裆针,“玉大人刨摩,你說我怎么就攤上這事∈蓝郑” “怎么了码邻?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長另假。 經(jīng)常有香客問我像屋,道長,這世上最難降的妖魔是什么边篮? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任己莺,我火速辦了婚禮,結(jié)果婚禮上戈轿,老公的妹妹穿的比我還像新娘凌受。我一直安慰自己,他們只是感情好思杯,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布胜蛉。 她就那樣靜靜地躺著,像睡著了一般色乾。 火紅的嫁衣襯著肌膚如雪誊册。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天暖璧,我揣著相機與錄音案怯,去河邊找鬼。 笑死澎办,一個胖子當(dāng)著我的面吹牛嘲碱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播局蚀,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼麦锯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琅绅?” 一聲冷哼從身側(cè)響起扶欣,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宵蛀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昆著,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年术陶,在試婚紗的時候發(fā)現(xiàn)自己被綠了凑懂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡梧宫,死狀恐怖接谨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塘匣,我是刑警寧澤脓豪,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站忌卤,受9級特大地震影響扫夜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驰徊,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一笤闯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棍厂,春花似錦颗味、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至张漂,卻和暖如春晶默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹃锈。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工荤胁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屎债。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像垢油,于是被迫代替她去往敵國和親盆驹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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