iOS —— RunTime詳解(傳送訊息)一
阿新 • • 發佈:2018-11-15
一、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
- RunTime簡稱執行時。OC就是執行時機制,也就是在執行時候的一些機制,其中最主要的是訊息機制。
- 對於C語言,函式的呼叫在編譯的時候會決定呼叫哪個函式。
- 對於OC語言,屬於動態呼叫過程,在編譯的時候並不能決定真正呼叫哪個函式,只有在真正執行的時候才會根據函式的名稱找到對應的函式來呼叫。事實證明:1、在編譯階段,OC可以呼叫任何函式,即使用這個函式並未實現,只要宣告過就不會報錯。2、在編碼階段,C語言呼叫未實現的函式就會報錯。
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:執行時機制,訊息機制是在執行時機制最重要的機制 // 訊息機制:任何方法呼叫,本質都是傳送訊息。 }