通過類別來給已經存在的類新增方法來實現自定義類
如果你需要新增乙個方法給乙個已經存在的類,也許能增加新的功能使你更容易來在我們的應用裡處理一些事情。最簡單的方法是用類別。
這個語法有點想類的介面描述但是他是沒有繼承類的,相反的要指定類別的名字在括號裡面。
@inte***ce classname (categoryname)
@end
乙個類別可以被定義在任何的類裡面。甚至你不知道他的實現比如objective-c的一些已經存在的類。定義在你類別的方法對原始類有效的,對繼承原始類也一樣,。在執行時對於你是類別的方法和原始類的方法是沒有區別的。
宣告類別我們通常是宣告乙個單獨的標頭檔案和實現檔案當用類別裡的方法的時候匯入他的標頭檔案就行了。
類別可以被用來宣告例項和類方法,但是不合適新增額外的屬性,在類別新增屬性是有效的,但是不能在類別新增額外的例項變數,這意味著編譯器不能合成任何例項變數,不能合成屬性訪問器方法,你可以自己在實現檔案裡寫訪問器方法,但是不能跟蹤屬性的值除非他已經存在原始的類裡面。
唯一的方法新增乙個屬性帶有新的例項變數在乙個已經存在的類用類的延展。
避免類別名字的衝突
因為新增類到已經知道的方法,所以應該小心給你的新建的類起名字。
如果這個方法定義在類目的名字和原始類的方法名字一樣,或者同乙個類的另乙個類目的方法名字相同或者甚至父類。當某個方法在執行時實現的原因,這種行為未定義。如果給自己的類新增類別是沒有這種可能的。但是向已經知道的類新增是有問題的。
舉個例子你想伺服器請求乙個資料並且給返回的字串進行編碼,你給nsstring新增乙個類目來做這個事情,當你鏈結另乙個框架的時候也有乙個類目有同樣的方法,那麼哪個在執行時候會勝出,哪個顯示未定義。
還有乙個問題會出現當乙個已經存在的類沒有某種方法你加了乙個類目提供這個方法實現,如果api更新了也存在這個方法,這時候意味著你的應用將可能出現衝突。
為了避免這個情況,最好新增方法的字首就像自定義類那時候一樣。
類的內部實現擴充套件延伸
類目和延展有點類似,但是你可以新增到類是有源**的在編譯時候,編譯時候就像類目一樣。定義語法:
@inte***ce classname ()
@end
因為沒有名字在括號裡,所以經常延展被稱為匿名類。
不想類目,延展是可以新增屬性例項變數的。
@inte***ce myclass()
@property nsobject *obj;
@end
編譯器會合成相關的訪問器方法,以及乙個例項變數在實現檔案。如果你在延展裡定義了乙個方法你必須實現這個方法在實現檔案裡面。新增例項變數的例項:
@inte***ce myclass () {
id _somecustominstancevariable; }
@end
使用延展來隱藏私人資訊
公有類定義了方法是別的類可以和你進行互動。類的延展經常擴充套件類的公有介面用額外的私有方法和屬性來給他們自己的類使用。例如你可以在介面宣告乙個唯讀的屬性,但是你可以在實現檔案宣告乙個可讀寫的屬性,目的是使本來可以改變屬性的值,而外部不能改變。
@inte***ce person:nsobject
@property (readonly)nsstring *uniqueidentifier;
- (void)dosomething;
@end
這意味著uniqueidentifier可以被另乙個物件改變,如果確實有兩個識別符號怎麼辦呢用dosomething再新建乙個。
為了使這個類自己能直接改變屬性,我們在類的實現裡面定義延展。如下:
@inte***ce mycalss ()
@property (readwrite) nsstring *uniqueidentifier;
@end
@implementation myclass
@end
這意味著編譯器能合成訪問器方法,因此延展的私有方法能改變這個屬性值。
別的類訪問這個方法會編譯錯誤的。
考慮其他的方法定製類:
考慮可重用行比如我建立 乙個自定義的button就是通過繼承而不是通過以上兩種方式來解決,因為還要匯入標頭檔案什麼的。
kvm官方文件
kvm官方文件 kvm活遷移 使用libvirt庫建立虛擬機器 domain 需要使用xml檔案作為配置檔案,如下是乙個最基本的虛擬機器配置檔案.2014 07 01 20 50 閱讀 233 在使用qemu建立虛擬機器的過程中是無法指定ip位址的,可是在實際應用中,我們是需要虛擬機器擁有ip位址的...
grok 官方文件
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!name code class html grok 解析任意文字並構造它 grok 是當前最好的方式在logstash 解析蹩腳的非結構化日誌資料 到一些結構化的可查詢的。這個工具是完美的對於syslog logs,apache和其他webserv...
PyGame官方文件
幫助內容 help contents 指導索引 reference index 最有用的東西 most useful stuff color display draw event font image key locals mixer mouse rect su ce time music pyga...