Objective-C沒有其他語言那種內置的命名空間 (namespace) 機制.在應用開發時,所有的代碼和引用的靜態庫最終都會被編譯到同一個域和二進制中。這樣的后果是一旦我們有重復的類名的話,就會導致編譯時的沖突和失敗。 鑒于此, 我們在起名時要設法避免潛在的命名沖突, 否則很容易就重名了. 如果發生命名沖突 (naming clash), 那么應用程序的鏈接過程就會出錯, 因為其中出現了重復符號:
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
錯誤原因在于, 應用程序中的兩份代碼都各自實現了名為 EOCTheClass 的類, 這導致 EOCTheClass 所對應的類符號和"元類"符號各定義了兩次
個人開發者添加的前綴必須為3個字母(2個字母的前綴為蘋果公司獨有)
給C實現函數添加前綴(因為C函數名會作為頂級符號,出現在符號表中)
<h5>避免命名沖突:</h5>
1.變相實現命名空間:為所有名稱都加上適當前綴。
2.使用Cocoa創建應用程序時一定要注意,Apple宣稱其保留使用所有“兩字母前綴”(two-letter-prefix)的權利,所以我們選用的前綴最好是三個字母的。
3.不僅是類名,應用程序中的所有名稱都應加前綴,包括分類以及分類方法。
4.在類的實現文件中,所用的純C函數以及全局變量,在編譯好的目標文件中,是要算作“頂級符號”(top-level-symbol)的。
5.可以參考之前static,如果不加static,在兩個.m文件中聲明同一個string 變量,會沖突報錯。
6.使用第三方庫A編寫自己的代碼,并準備將其發布為程序庫B供他人開發程序所用,此時應該給所用的那一份第三方庫A代碼都加上自己的前綴。(現在一般使用Cocoapods來管理第三方,這種第三方庫沖突就很少見了)
<h5>總結:</h5>
選擇與公司、應用程序或二者皆有關聯之名稱作為類名的前綴,并在所有代碼中均使用這一前綴。
若自己所開發的程序庫中用到了第三方庫,則應為其中的名稱加上前綴。