使用 方法調配技術 除錯 黑盒方法

2021-07-11 13:05:29 字數 2008 閱讀 6158

在不需要源**的情況下,在執行期改變特定方法的執行(改變功能), 我們也不需要通過繼承子類來覆寫方法就能改變這個類本身的功能. 新功能將在本類的所有例項中生效, 這種方法通常叫做」方法調配」.

類的方法列表會把選擇子的名稱對映到相關的方法實現之上, 使」動態資訊派發系統」,能夠根據此找到應該呼叫的方法, 這些方法溝通過指標的形式表示, 這種指標叫做imp

id (* imp) (id, sel, ...)

以』nsstring』 為例

nsstring可以響應lowercasestring,uppercasestring等選擇子(即方法), 用圖表示如圖 1-1

objective-cruntime提供幾個方法可以操作這個. 下面提供交換兩個方法的**示例

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...