Runtime 可以給開發帶來的便利

2021-09-25 18:51:19 字數 2048 閱讀 7776

一、要想讓runtime給我們開發帶來便利 就要先了解他的原理

runtime其實object-c中一套底層的c語言api,是乙個將c語言轉化為物件導向語言的拓展,

oc是一種物件導向的動態語言,動態語言其實就是在執行靜態語言編譯連線工作。oc編寫的程式不能直接機器能讀懂的語言,在執行時候,必須依靠runtime進行轉換,runtime圍繞兩個中心:類的動畫跟訊息**.

二、了解了他的原理再說一說他的應用場景,後面再講他給開發帶來的便利.

1、動態的在記憶體中建立乙個類

2、動態的給類增加乙個屬性

3、動態的給類增加乙個協議

4、動態給類增加乙個方法實現imp(乙個函式指標,儲存了方法的位址)

區別於sel(類成員方法的指標,但不同於c語言中的函式指標,函式指標直接儲存了方法的位址,但sel只是方法編號。)。sel 指標只是儲存了方法編號,imp是直接儲存了方法的位址。

1、攔截系統自動的方法(呼叫method swizzling黑魔法)(可以在自己的交換的方法裡面做一些自己想做的事情)

2、將某些oc**轉換為runtime**,**底層,比如說實現block的原理

3、實現給分類增加屬性(這個也可以做很多事情)

4、實現nscoding的自動歸檔跟解當

5、實現字典的模型跟自動轉換

6、jspatch替換已有的oc方法實行等

7、手動實現多繼承

8、實現字典轉模型

(1) class和id

class是乙個指向objc_class結構體的指標,而id是乙個指向objc_object結構體的指標,其中的isa是乙個指向objc_class結構體的指標。其中的id就是我們所說的物件,class就是所說的類。

類和物件的區別就是模擬物件多了很多特徵成員,類也可以當做乙個objc_object來對待,也就是說類和物件都是物件,分別稱為類物件(class object)例項物件(instance object),這樣我們就可以區別物件和類了。

objc_object(例項物件)中的isa指標指向的類結構稱為class,其中存放著普通成員變數和動態方法;objc_class中的isa指標指向類結構的metaclass,其中存放著static型別的成員變數和static型別的方法。

2.sel

sel是selector在oc中的變現型別。selector可以理解為區別方法的id。

(3) imp

imp是implementation的縮寫,它是由編譯器生成的乙個函式指標。當你發起乙個訊息後,這個函式指標確定了最終執行那段**。

(4) method

method代表類中的某個方法型別

(5) ivar

ivar代表類中例項變數的型別

struct objc_ivar
(6)objc_property_t

objc_property_t是屬性,它的定義如下:

(7) category

這個就是分類,可以動態的為已存在的類新增新的方法。

在物件導向程式設計中,物件呼叫方法叫做傳送訊息。在程式設計中,程式源**就會從物件傳送訊息轉化成runtime的objc_msgsend函式呼叫。

例如我們寫的

[target domethodwith:var]; 會被編譯器翻譯成objc_msgsend(target,@selector(domethodwith:),var);
基本訊息傳遞

訊息動態解析流程

呼叫class_addmethod(__unsafe_unretained class cls, sel name, imp imp, const char *types)方法給指定類新增方法。

imp引數:實現被新增方法的函式,在本例中func3是指func3的位址指標;

types引數:乙個定義該函式返回值型別和引數型別的字串。本例中"v@:"意思是v代表無返回值void,@代表id sel;:代表sel _cmd;

要注意的是:func3方法前的void不加+、-號,因為這是c的**;必須有指定兩個引數(id self,sel _cmd);

事務併發帶來的問題

髒讀 事務a對某個資料進行修改,但是還沒提交到資料庫中 此時事務b對這個資料進行訪問,我們把b事務訪問到的這個未提交的資料稱為 髒資料 事務b的這種行為稱為 髒讀 丟失修改 事務a和事務b同時對某乙個資料進行訪問,且此時a修改了資料如a a 1,b同時也對a進行修改,a a 1,此時a的修改結果將會...

資料併發帶來的各種情況

一 資料併發帶來的各種情況 髒讀 事務a讀到事務b尚未提交的資料,並基於這個資料進行後續操作 不可重複讀 事務a讀取資料後,被事務b修改或刪除,事務a再次讀取時前後兩次讀取的資料不一致 幻像讀 事務a讀取資料後,事務b新增了資料,事務a再次讀取是前後兩次讀取的資料不一致 不可重複讀和幻想讀的區別 幻...

Mysql關於事務併發帶來的問題

mysql從5.5.8開始,innodb就是預設的儲存引擎,innodb最大的特點是 支援事務 支援行級鎖。既然支援事務,那麼就會有處理併發事務帶來的問題 更新丟失 髒讀 不可重複讀 幻讀 相應的為了解決這四個問題,就產生了事務隔離級別 未提交讀 read uncommitted 已提交讀 read...