Objective-C沒有其他語言那種內(nèi)置的命名空間 (namespace) 機(jī)制.在應(yīng)用開發(fā)時(shí),所有的代碼和引用的靜態(tài)庫最終都會(huì)被編譯到同一個(gè)域和二進(jìn)制中颁股。這樣的后果是一旦我們有重復(fù)的類名的話,就會(huì)導(dǎo)致編譯時(shí)的沖突和失敗谴返。 鑒于此, 我們?cè)谄鹈麜r(shí)要設(shè)法避免潛在的命名沖突, 否則很容易就重名了. 如果發(fā)生命名沖突 (naming clash), 那么應(yīng)用程序的鏈接過程就會(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 的類, 這導(dǎo)致 EOCTheClass 所對(duì)應(yīng)的類符號(hào)和"元類"符號(hào)各定義了兩次
個(gè)人開發(fā)者添加的前綴必須為3個(gè)字母(2個(gè)字母的前綴為蘋果公司獨(dú)有)
給C實(shí)現(xiàn)函數(shù)添加前綴(因?yàn)镃函數(shù)名會(huì)作為頂級(jí)符號(hào),出現(xiàn)在符號(hào)表中)
<h5>避免命名沖突:</h5>
1.變相實(shí)現(xiàn)命名空間:為所有名稱都加上適當(dāng)前綴结榄。
2.使用Cocoa創(chuàng)建應(yīng)用程序時(shí)一定要注意,Apple宣稱其保留使用所有“兩字母前綴”(two-letter-prefix)的權(quán)利窒盐,所以我們選用的前綴最好是三個(gè)字母的草则。
3.不僅是類名,應(yīng)用程序中的所有名稱都應(yīng)加前綴蟹漓,包括分類以及分類方法炕横。
4.在類的實(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.使用第三方庫A編寫自己的代碼拾枣,并準(zhǔn)備將其發(fā)布為程序庫B供他人開發(fā)程序所用,此時(shí)應(yīng)該給所用的那一份第三方庫A代碼都加上自己的前綴盒让。(現(xiàn)在一般使用Cocoapods來管理第三方梅肤,這種第三方庫沖突就很少見了)
<h5>總結(jié):</h5>
選擇與公司、應(yīng)用程序或二者皆有關(guān)聯(lián)之名稱作為類名的前綴邑茄,并在所有代碼中均使用這一前綴姨蝴。
若自己所開發(fā)的程序庫中用到了第三方庫,則應(yīng)為其中的名稱加上前綴肺缕。