OC · 記——Runtime(一) 發送消息

Runtime介紹

運行時,OC就是運行時機制,最主要的是消息機制。
對于C語言,函數的調用在編譯的過程中會決定調用哪個函數。
對于OC,則屬于動態調用過程,只有在真正運行的時候才會根據函數名找到對應的函數。

Runtime作用

1.發送消息 objc_msgSend
方法調用的本質,就是讓對象發送消息。
2.交換方法 method_exchangeImplementations
系統自帶的方法功能不夠時,想給系統自帶的方法擴展一些功能,并且保持原有的功能。
3.動態添加方法 class_addMethod
如果一個類的方法很多,加載類到內存的時候耗費資源,需要給每個方法生成映射表,可以使用動態給某個類,添加方法解決。
4.動態添加屬性 objc_setAssociatedObject
給一個類聲明屬性,其實本質就是給這個類添加關聯,并不是直接把這個值的內存空間添加到類存空間,就是對象本身的屬性可以關聯到另外一個內存中。

發送消息

使用運行時的第一步:
1.#import <objc/message.h>
2.xcode-->build settings->搜索msg

Paste_Image.png

我們先創建一個Person對象,創建一個類方法,一個對象方法,如下代碼所示:

#import "Person.h"
@implementation Person
+ (void)eat
{
    NSLog(@"類方法——吃飯");
}
- (void)eat
{
    NSLog(@"對象方法——吃面");
}
@end

我們在控制器中調用,首先,#import "Person.h"

Person * p = [[Person alloc] init];
//我們一般調用對象方法,都會這樣寫:[p eat],
//現在用runtime讓對象p發送一個消息。
objc_msgSend(p, @selector(eat));
//按照以前,我們調用類方法,都會是這樣寫的
//[Person eat] 那使用runtime調用類方法,跟調用對象方法類似。
//獲取類對象
Class personClass = [Person class];
//運行時:拿到類對象,調用類方法。
objc_msgSend(personClass, @selector(eat));

ok,我們運行程序:

2017-01-18 10:46:22.940 [70808:6452367] 對象方法——吃面
2017-01-18 10:46:22.940 [70808:6452367] 類方法——吃飯

現在我再寫一個對象方法,添加一個值,在控制器中傳過去。

- (void)ride:(int)age
{
    NSLog(@"%d",age);
}

控制器中調用

objc_msgSend(p, @selector(ride:),10);

運行結果:

2017-01-18 10:51:41.083 [71101:6456914] 10

如果我們不用runtime來發送消息,還有另外一種方式也可以調用類方法和對象方法,那就是SEL。

Person * p = [[Person alloc] init];
//SEL:方法編號,根據方法編號就可以找到對應方法實現,屬于動態調用
[p performSelector:@selector(eat)];
//獲取類對象
//類名調用類方法,本質類名轉換成類對象
Class personClass = [Person class];
[personClass performSelector:@selector(eat)];

運行結果一樣:

2017-01-18 10:46:22.940 [70808:6452367] 對象方法——吃面
2017-01-18 10:46:22.940 [70808:6452367] 類方法——吃飯
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的轉載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,628評論 33 466
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,774評論 0 9
  • 參考鏈接: http://www.cnblogs.com/ioshe/p/5489086.html 簡介 Runt...
    樂樂的簡書閱讀 2,156評論 0 9
  • 對于從事 iOS 開發人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,732評論 7 64
  • 所謂的父女母子一場,只不過意味著,你和他的緣分就是今生今世不斷地在目送他的背影漸行漸遠.你站立在小路的這一端,看著...
    閑者時間_王掌柜閱讀 289評論 1 1