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>
選擇與公司、應(yīng)用程序或二者皆有關(guān)聯(lián)之名稱(chēng)作為類(lèi)名的前綴,并在所有代碼中均使用這一前綴。
若自己所開(kāi)發(fā)的程序庫(kù)中用到了第三方庫(kù),則應(yīng)為其中的名稱(chēng)加上前綴。