1. 程式人生 > >iOS —— RunTime詳解(傳送訊息)一

iOS —— RunTime詳解(傳送訊息)一

一、RunTime簡介
  • RunTime簡稱執行時。OC就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制。
  • 對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式。
  • 對於OC語言,屬於動態呼叫過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫。事實證明:1、在編譯階段,OC可以呼叫任何函式,即使用這個函式並未實現,只要宣告過就不會報錯。2、在編碼階段,C語言呼叫未實現的函式就會報錯。
二、RunTime作用
1、傳送訊息 2、交換方法 3、動態新增方法 4、動態新增屬性

1、傳送訊息:
方法呼叫的本質,就是讓物件傳送訊息。
objc_msgSend,只有物件才參傳送訊息,因此以objc開頭。
使用訊息機制的前提,必須匯入#import<objc/message.h>
報錯:解決:
objc_msgSend(void /* id self, SEL op, ... */ ) 解決報錯:Too many arguments to function call, expected 0, have 2


解決方法:選中專案-Project- Build Settings -Enable Strict Checking of objc-msgSend Calls 。將其設定為NO即可。



例:

Persion.h

#import <Foundation/Foundation.h>

@interface Persion : NSObject
#pragma mark- 跑步
- (void)run;

+ (void)run;

- (void)run:(int)length;

@end

Persion.m

#import "Persion.h"

@implementation Persion
-(void)run
{
    NSLog(@"公園跑步");
}

+ (void)run
{
    NSLog(@"類方法跑步");
}

- (void)run:(int)length
{
    NSLog(@"跑了多少米:=%d",length);
}

@end

ViewController.h

#import "ViewController.h"
#import "Persion.h"
#import <objc/message.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    Persion *p=[[Persion alloc]init];
    
    //呼叫物件方法
    [p run];
    
    [p performSelector:@selector(run)];
    
    //本質:讓物件傳送訊息
    objc_msgSend(p, @selector(run));
    
    //帶引數的
    objc_msgSend(p, @selector(run:),10);
    
    
    //呼叫類方法
    //第一種通過類名呼叫 類名呼叫類方法,本質類名轉換成類物件。
    [Persion run];
    
    //第二種通過類物件呼叫
    [[Persion class]run];
    
    //用類名呼叫類方法,底層會自動把類名轉換成物件呼叫
    objc_msgSend([Persion class], @selector(run));

    //OC:執行時機制,訊息機制是在執行時機制最重要的機制
    // 訊息機制:任何方法呼叫,本質都是傳送訊息。
    
}