1:任何方法調用的本質:xcode
發送一個消息,用Runtime發送消息,OC底層的實現就是使用Runtime去實現的.測試
2:怎樣驗證:方法調用,是否真的是轉化爲消息機制呢?ui
> 01-最終生成消息機制,是編譯器作的事情
> 02-若是想看最終代碼,須要把當前代碼從新編譯,使用xcode編譯器:clang編譯器去從新編譯就能夠看到spa
使用clang編譯器去查看最終的消息機制代碼步驟?命令行
>: 打開xcode新建工程-->選擇OS X、Application-->Command Line Tool-->建立一個命令行工程
>: 而後在main.m文件中,建立對象,如:
code
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { id objc = [NSObject alloc]; objc = [objc init]; } return 0; }
>: 打開終端:進入該工程中的目錄下,main.m的上一級目錄,cd +(目錄下)對象
>:使用這個命令:clang -rewrite-objc main.m ,就會在main.m同級目錄下生成一個main.cpp文件,打開雙擊就能夠看到最終的代碼:按住command + f--->搜索autoreleasepool-->就能夠看到建立對象的那兩行代碼的消息機制代碼編譯器
3:根據以上論證,咱們能夠本身測試使用,具體步驟?it
> 使用Runtime運行時第一步:導入頭文件 :#import <objc/message.h>io
#import <objc/message.h>
> xcode6以前,蘋果容許咱們使用objc_msgSend,並且是有參數提示的;xcode6,蘋果再也不推薦咱們使用runtime
解決參數提示配置:工程文件-->BuildSetting-->搜索msg-->修改成NO便可
測試代碼:
- (void)viewDidLoad { [super viewDidLoad]; /** * 1:使用運行時去測試第一步:導入頭文件 #import <objc/message.h> * 2:xcode6以前,蘋果容許你使用objc_msgSend(),並且有參數提示 xcode6,蘋果不推薦咱們使用runtime 解決參數提示配置:工程文件-->buildSetting-->搜索msg-->修改成NO便可 */ /** * 1:類方法本質:類對象調用[NSObject class] */ // id:誰發送消息 // SEL:發送什麼消息 //id objc = [NSObject alloc]; id objc = objc_msgSend([NSObject class], @selector(alloc)); //objc = [objc init]; objc = objc_msgSend(objc, @selector(init)); }
意見反饋郵件:1415429879@qq.com
歡迎大家的閱讀和讚揚、謝謝!