一、要想讓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...