Hook Objective-C 的方法

來源:互聯網
上載者:User

在 Windows 中主要有兩種鉤子:訊息鉤子與函數鉤子,有時在實現某些功能時必須用鉤子。

對函數掛鈎子主要是進行入口地址的替換,廣義的理解很多東西都是鉤子,比如中斷向量表。

可以對 C++ 中的靜態函數與虛函數掛鈎子,但是很難對普通函數掛鈎子,主要原因是C++沒有統一的 ABI標準。

但是可以對 Objective-C 掛鈎子,而且OC提供了一些運行時方法,讓掛鈎子相對簡單,比如:不需要用彙編來改地址。

下面以對 UIWebView 的 loadRequest: 掛鈎子作為例子,來說明如何在 Objective-C 中掛鈎子。

類名:UIWebView

方法名:loadRequest:

對應的C原型:

typedef void (*UIWebView_loadRequest__IMP)(UIWebView* self, SEL _cmd, NSURLRequest *request);

static UIWebView_loadRequest__IMP original_UIWebView_loadRequest;

void replaced_UIWebView_loadRequest(UIWebView* self, SEL _cmd, NSURLRequest *request) {

    original_UIWebView_loadRequest(self, _cmd, request);

    // TODO:

}

// 在某個點,例如:application:didFinishLaunchingWithOptions: 中加入如下代碼,就完成了掛鈎。

Method method = class_getInstanceMethod(NSClassFromString(@"UIWebView"), @selector(loadRequest:));

original_UIWebView_loadRequest = method_setImplementation(method, replaced_UIWebView_loadRequest);

應用情境:

大家一起想想^_^

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.