初識(shí) Runtime機(jī)制 - 發(fā)送消息

runtime:簡(jiǎn)稱運(yùn)行時(shí),耳熟能詳,其中最主要的就是消息機(jī)制

C與OC的比較

1.對(duì)于C語(yǔ)言,函數(shù)的調(diào)用在編譯的時(shí)候就會(huì)決定調(diào)用哪個(gè)函數(shù)

2.對(duì)于OC的函數(shù):屬于動(dòng)態(tài)調(diào)用過(guò)程。在編譯的時(shí)候并不能決定真正調(diào)用哪個(gè)函數(shù),只有在真正運(yùn)行的時(shí)候才會(huì)根據(jù)函數(shù)的名稱找到對(duì)應(yīng)的函數(shù)來(lái)調(diào)用。

事實(shí)證明

1.在編譯階段,OC可以調(diào)用任何函數(shù),即使這個(gè)函數(shù)并未實(shí)現(xiàn),只要聲明過(guò)就不會(huì)報(bào)錯(cuò)。

2.在編譯階段,C語(yǔ)言調(diào)用未實(shí)現(xiàn)的函數(shù)就會(huì)報(bào)錯(cuò)。

運(yùn)行時(shí)最重要的機(jī)制 ---- 消息機(jī)制
// 消息機(jī)制:任何方法的調(diào)用,本質(zhì)都是發(fā)送消息

// 首先先介紹運(yùn)行時(shí)如何發(fā)送消息,(也就是我們所說(shuō)的如何調(diào)用一個(gè)類里面的實(shí)例方法和類方法 注:我自己的理解)
/**
1. 導(dǎo)入<objc/message.h>
2.進(jìn)入工程名 -- Building Setting -->搜索msg -->設(shè)置為NO
做第二步的原因: xcode5之后,蘋果不建議使用底層
如果你沒(méi)改之前敲objc_msgSend(); 這個(gè)方法里面,你是看不到需要什么參數(shù)的。
改之后你就會(huì)看到這樣的 objc_msgSend(id self, SEL op,...);

運(yùn)行時(shí),發(fā)送消息,誰(shuí)做事情就拿誰(shuí) --> self;
*/

代碼部分

// 自己寫的,沒(méi)在工程里面,你們可以那去工程里面實(shí)現(xiàn)一下
1.創(chuàng)建一個(gè)類
#頭文件
#import <Foundation/Foundation.h>

@interface Person : NSObject

// 類方法
+ (void)sleep;

// 實(shí)例方法
- (void)sleep;

// 帶參數(shù)
- (void)sleep:(NSUInteger)hour;
@end


#實(shí)現(xiàn)文件
#import "Person.h"

@implementation Person

+ (void)sleep{
      NSLog(@"類方法 --- 睡覺(jué)");
}

- (void)sleep{
  NSLog(@"對(duì)象方法-- 睡覺(jué)");
}

- (void)sleep:(NSUInteger)hour{
    NSLog(@"睡了%zd個(gè)小時(shí)",hour);
}

@end

#控制器的viewDidLoad方法里面。
#你不要告訴我   你不知道這是什么方法
#首先肯定是導(dǎo)入類了 #import "Person.h"  
#import <objc/Message.h>

- (void)viewDidLoad{
    [super viewDidLoad];
   
    Person *p = [[Person alloc] init];
    // 睡覺(jué)
    [p sleep];
  
// OC: 運(yùn)行時(shí)機(jī)制,消息機(jī)制是最重要的,現(xiàn)在又強(qiáng)調(diào)了一遍
// 消息機(jī)制:任何方法的調(diào)用,本質(zhì)都是發(fā)送消息

 // 平時(shí)常用的形式
// SEL: 方法編號(hào),根據(jù)方法編號(hào)就可以找到對(duì)應(yīng)的方法實(shí)現(xiàn)
[p performSelector:@selector(sleep)];

// 運(yùn)行時(shí):發(fā)送消息   ,誰(shuí)做事情就拿誰(shuí)
//1.導(dǎo)入框架(cmd + 點(diǎn)擊進(jìn)去看方法(函數(shù)))
//2. 進(jìn)入setting里面設(shè)置為NO

// 調(diào)用無(wú)參的實(shí)例方法
objc_msgSend(p,@selector(sleep));

// 調(diào)用有參數(shù)的實(shí)例方法
objc_msgSend(p,@selector(sleep:),8);

#類名調(diào)用類方法,本質(zhì)就是將類名轉(zhuǎn)換為類對(duì)象
// 獲取類對(duì)象
Class personClass = [Person Class];

//平時(shí)
 [personClass performSelector:@selector(sleep)];

// 運(yùn)行時(shí)
objc_msgSend(personClass,@selector(sleep));

#到這里就完成了運(yùn)行時(shí)機(jī)制的發(fā)送消息。
#今晚我也只看了這一點(diǎn)點(diǎn),然后 分享出來(lái)
#不喜歡的可以說(shuō),喜歡的也可以說(shuō),接受噴也接受喜愛(ài)。
#然后代碼是自己在windows下面手寫的,沒(méi)進(jìn)mac。
#因?yàn)槭呛谔O果,不方便。如果代碼哪里出錯(cuò)了,自己解決
#當(dāng)然也可以找我,我也不一定能解決,呃。我好像就是這么矛盾。


##晚安。希望看到這篇文章的人好夢(mèng)。天天開(kāi)心。晚安。##


}

運(yùn)行時(shí)發(fā)送消息 完結(jié) end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容