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)心。晚安。##
}