首先補充說明一下,這個系列不是教程,所以除了很可能會出錯之外,而且不會按什麼由淺入深的順序來寫。寫什麼主題完全看心情。
從C#轉到Objective-c開發之後,會產生這麼一個疑問:
Objective-C似乎沒有命名空間?
沒錯。C++和C#有namespace,Java有Package(當然和Namespace有差別),我最近開始寫的PHP也有如namespace com\example\johnslibrary\people;的命名空間,就連JavaScript。。。好吧讓我們忘了JavaScript吧,它應該沒有內建namespace(見http://elegantcode.com/2011/01/26/basic-javascript-part-8-namespaces/ 和 http://addyosmani.com/blog/essential-js-namespacing/)。
在開發C#的時候,經常會遇到不同NameSpace下有同樣名字的類的情況。這時候就可以通過alias來區分。
比如
using n1=Namespace1;using n2=Namespace2;n1.ClassA=new n1.ClassA();n2.ClassA=new n2.ClassA();
但Objective-C沒有。
類似c,所有的東西都運行在同一個全域的命名空間裡。
所以在建立Objective-c的應用的時候,會有文字框,供輸入首碼(prefix)。
“NS”是內建的Cocoa的首碼,表示NextStep。這個首碼被蘋果佔了。NextStep與Mac OS的關係就不多說了。
但相比CompanyA.XXX.YYY這樣的通常NameSpace命名,首碼很容易衝突。如果我開了家叫MoeSoft的公司,首碼說不定就和微軟衝突了。
如果同時引用了MS首碼的MoeSoft和Microsoft的類庫就很可能悲劇了。
在stackoverflow有提出這樣的解決方案:
用NSBundle來載入其中一個framework,然後複製並重新命名,接下來載入另一個namespace。
另外還有一個建議是用@compatibility_alias來“重新命名”類。
詳細的可以看:
http://stackoverflow.com/questions/178434/what-is-the-best-way-to-solve-an-objective-c-namespace-collision
但如果能避免這個問題的話,還是盡量避免。那成語怎麼說來著?君子不立危牆之下。
所以除非是在寫最簡單的測試代碼,不然還是最好給自己的應用起一個足夠長足夠獨特的首碼。