[Runtime]-發送消息

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

歡迎大家的閱讀和讚揚、謝謝

相關文章
相關標籤/搜索