在不需要源**的情況下,在執行期改變特定方法的執行(改變功能), 我們也不需要通過繼承子類來覆寫方法就能改變這個類本身的功能. 新功能將在本類的所有例項中生效, 這種方法通常叫做」方法調配」.
類的方法列表會把選擇子的名稱對映到相關的方法實現之上, 使」動態資訊派發系統」,能夠根據此找到應該呼叫的方法, 這些方法溝通過指標的形式表示, 這種指標叫做imp
id (* imp) (id, sel, ...)
以』nsstring』 為例
nsstring可以響應lowercasestring
,uppercasestring
等選擇子(即方法), 用圖表示如圖 1-1
objective-c
runtime提供幾個方法可以操作這個. 下面提供交換兩個方法的**示例
nsstring *str = @"i am xtto";
nslog(@"lowercasestring: %@", [str lowercasestring]);
nslog(@"uppercasestring: %@", [str uppercasestring]);
method originalmethod = class_getinstancemethod([nsstring class], @selector(lowercasestring));
nslog(@"lowercasestring: %@", [str lowercasestring]);
nslog(@"uppercasestring: %@", [str uppercasestring]);
// 2016-05-01 01:07:38.939 demo[3707:55823] lowercasestring: i am otto
// 2016-05-01 01:07:38.940 demo[3707:55823] uppercasestring: i am xtto
// 2016-05-01 01:07:38.940 demo[3707:55823] lowercasestring: i am xtto
// 2016-05-01 01:07:38.940 demo[3707:55823] uppercasestring: i am xtto
上面的**演示了交換兩個方法的實現, 但是在實際的應用中並不是特別的大. 因為這兩個方法系統各自實現了響應的功能,沒有必要做一些交換. 但是我們可以為這些方法新增一些新的功能, 重點來了 -.-
1. 為nsstring
建立category
@inte***ce
nsstring (xtadd)
- (nsstring *)xt_mylowercasestring;
@end
實現
- (nsstring *)xt_mylowercasestring
method
originalmethod = class_getinstancemethod
([nsstring class], @selector(lowercasestring));
method
([nsstring class], @selector(xt_mylowercasestring));
// 2016-05-01 01:17:09.492 demo[3812:61108] 記錄資訊 :i am xtto => i am otto
// 2016-05-01 01:17:09.493 demo[3812:61108] lowercasestring: i am xtto
總結: 這個方法可以為」完全不知道具體如何實現(不透明的), 黑盒方法增加日誌記錄功能」, 除錯程式時會很有用, 不宜濫用. 除錯必備 NSLog使用方法
nslog定義在nsobjcruntime.h中,如下所示 void nslog nsstring format,基本上,nslog很像printf,同樣會在console中輸出顯示結果。不同的是,傳遞進去的格式化字元是nsstring的物件,而不是chat 這種字串指標。nslog可以如下面的方法...
gdb除錯程式使用方法
1 啟動程式 gdb a.out 2 進來後在gdb模式,執行r開始啟動,如果要帶命令列引數,則在r後依次輸入 gdb r 0 1 3 進入程式後,按鍵ctrl c進入gdb模式 program received signal sigint,interrupt.0x0012d422 in kerne...
GDB簡單除錯使用方法
如何用gdb執行程式 gcc gdb test.c o gdb test g 編譯程式 gdb r 執行程式 gdb bt full 列印當前的函式呼叫棧的所有資訊 多檔案打斷點 例 對gdb test.c的第三行打斷點 b gdb test.c 3 對多個檔案中的某乙個檔案的函式打斷點 例 b g...