15:用前綴避免命名空間沖突

Objective-C沒(méi)有其他語(yǔ)言那種內(nèi)置的命名空間 (namespace) 機(jī)制.在應(yīng)用開(kāi)發(fā)時(shí),所有的代碼和引用的靜態(tài)庫(kù)最終都會(huì)被編譯到同一個(gè)域和二進(jìn)制中。這樣的后果是一旦我們有重復(fù)的類(lèi)名的話(huà),就會(huì)導(dǎo)致編譯時(shí)的沖突和失敗。 鑒于此, 我們?cè)谄鹈麜r(shí)要設(shè)法避免潛在的命名沖突, 否則很容易就重名了. 如果發(fā)生命名沖突 (naming clash), 那么應(yīng)用程序的鏈接過(guò)程就會(huì)出錯(cuò), 因?yàn)槠渲谐霈F(xiàn)了重復(fù)符號(hào):

duplicate symbol OBJC_METACLASS$_EOCTheClass in:
build/something.o
build/something_else.o
duplicate symbol OBJC_CLASS$_EOCTheClass in:
build/something.o
build/something_else.o

錯(cuò)誤原因在于, 應(yīng)用程序中的兩份代碼都各自實(shí)現(xiàn)了名為 EOCTheClass 的類(lèi), 這導(dǎo)致 EOCTheClass 所對(duì)應(yīng)的類(lèi)符號(hào)和"元類(lèi)"符號(hào)各定義了兩次

個(gè)人開(kāi)發(fā)者添加的前綴必須為3個(gè)字母(2個(gè)字母的前綴為蘋(píng)果公司獨(dú)有)
給C實(shí)現(xiàn)函數(shù)添加前綴(因?yàn)镃函數(shù)名會(huì)作為頂級(jí)符號(hào),出現(xiàn)在符號(hào)表中)

<h5>避免命名沖突:</h5>

1.變相實(shí)現(xiàn)命名空間:為所有名稱(chēng)都加上適當(dāng)前綴。

2.使用Cocoa創(chuàng)建應(yīng)用程序時(shí)一定要注意,Apple宣稱(chēng)其保留使用所有“兩字母前綴”(two-letter-prefix)的權(quán)利,所以我們選用的前綴最好是三個(gè)字母的。

3.不僅是類(lèi)名,應(yīng)用程序中的所有名稱(chēng)都應(yīng)加前綴,包括分類(lèi)以及分類(lèi)方法。

4.在類(lèi)的實(shí)現(xiàn)文件中,所用的純C函數(shù)以及全局變量,在編譯好的目標(biāo)文件中,是要算作“頂級(jí)符號(hào)”(top-level-symbol)的。

5.可以參考之前static,如果不加static,在兩個(gè).m文件中聲明同一個(gè)string 變量,會(huì)沖突報(bào)錯(cuò)。
6.使用第三方庫(kù)A編寫(xiě)自己的代碼,并準(zhǔn)備將其發(fā)布為程序庫(kù)B供他人開(kāi)發(fā)程序所用,此時(shí)應(yīng)該給所用的那一份第三方庫(kù)A代碼都加上自己的前綴。(現(xiàn)在一般使用Cocoapods來(lái)管理第三方,這種第三方庫(kù)沖突就很少見(jiàn)了)

<h5>總結(jié):</h5>

  1. 選擇與公司、應(yīng)用程序或二者皆有關(guān)聯(lián)之名稱(chēng)作為類(lèi)名的前綴,并在所有代碼中均使用這一前綴。

  2. 若自己所開(kāi)發(fā)的程序庫(kù)中用到了第三方庫(kù),則應(yīng)為其中的名稱(chēng)加上前綴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • 我們?cè)跇?gòu)建應(yīng)用程序時(shí),可能想將其中部分代碼用于后續(xù)項(xiàng)目,也可能想把某些代碼發(fā)布出來(lái),供他人使用。即便現(xiàn)在還不想這么...
    CoderCurtis閱讀 896評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評(píng)論 25 709
  • Objective-C沒(méi)有其他語(yǔ)言那種內(nèi)置的命名空間 (namespace) 機(jī)制. 鑒于此, 我們?cè)谄鹈麜r(shí)要設(shè)法...
    spbreak閱讀 615評(píng)論 0 0
  • 看到越來(lái)越多的西式餐廳代替中式飯店,我不想感嘆文化的多元,不想議論世界的開(kāi)放,不想承認(rèn)美食的無(wú)國(guó)界,只想靜靜地懷念...
    不問(wèn)成敗閱讀 181評(píng)論 0 0

友情鏈接更多精彩內(nèi)容