Runtime那些事兒(訊息機制)
一、關於runtime
之前在專案中有遇到過用runtime解決改變全域性字型的問題,所以再一次感受到了runtime黑魔法的強大,趁現在有機會分享一下對runtime的一些理解。在物件呼叫方法是Objective-C中經常使用的功能,也就是訊息的傳遞,而Objective-C是C的超集,所以和C不同的是,Objective-C使用的是動態繫結,也就是runtime。Objective-C的訊息傳遞和訊息機制也就不多說了,今天主要說的是動態方法,也就是函式的呼叫。
二、相關的幾個函式
下面一張圖詳細的概括了每個函式呼叫的先後以及執行的前提
訊息傳遞函式的呼叫
1.物件在收到無法解讀的訊息後,首先會呼叫所屬類的
1 |
+ (BOOL)resolveInstanceMethod:(SEL)sel
|
這個方法在執行時,沒有找到SEL的IML時就會執行。這個函式是給類利用class_addMethod新增函式的機會。根據文件,如果實現了新增函式程式碼則返回YES,未實現返回NO。舉個例子,新建了一個工程,首先我在ViewController這個類中執行doSomething1這個方法,程式碼如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//
// ViewController.m
// RuntimeTest1
//
// Created by HenryCheng on 15/12/24.
// Copyright ?(版權符號) 2015年 www.igancao.com All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[ super viewDidLoad];
[self performSelector:@selector(doSomething)];
}
- (void)didReceiveMemoryWarning {
[ super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
|
執行結果
1 2 3 |
**2015-12-24 10:35:37.726 RuntimeTest1[1877:337842] -[ViewController doSomething]: unrecognized selector sent to instance 0x7fe9f3736680**
**2015-12-24 10:35:37.729 RuntimeTest1[1877:337842] *** Terminating app due to uncaught exception 'NSInvalidArgumentException' , reason: '-[ViewController doSomething]: unrecognized selector sent to instance 0x7fe9f3736680'
|