Swift 5 執(zhí)行Runtime與OC之間的不同

首先說(shuō)一下objectc是動(dòng)態(tài)語(yǔ)言而swift是靜態(tài)語(yǔ)言,而runtime又是基于動(dòng)態(tài)語(yǔ)言的運(yùn)行時(shí)進(jìn)行的一些操作,所以就導(dǎo)致swift并不能像oc那樣簡(jiǎn)單的使用runtime

一、關(guān)于類屬性的名稱、類型、運(yùn)行時(shí)賦值和獲取值。

class_copyIvarList 和 class_copyProperty 是獲取當(dāng)前類變量的方法

class_copyIvarList 可以獲取全部的屬性
class_copyProperty 只能獲取@property的屬性
以上兩個(gè)方法在swift中都可以獲取到全部屬性包括私有屬性但是不包括擴(kuò)展里Associated設(shè)置的屬性(目前我測(cè)試是這樣的)

由于swift中很多類型都是值類型,比如NSString有了可替換的String,所以并不能動(dòng)態(tài)編譯。

在swift中定義String類型的屬性 在使用object_getIvar和object_setIvar時(shí)候會(huì)導(dǎo)致bad access, 目前可替換的方法是讓本類繼承NSObject并且用@objc修飾定義的String,使用value(for:key)方法獲取value;

至于Int可以 @objc dynamic var order_batch : Int = 0 初始化賦值的時(shí)候需要手動(dòng)判空了,其他沒(méi)有初始值的定義也可以參考Int樣式定義

二、swift的extension和oc的category中不能定義屬性但是可以使用runtime設(shè)置附加屬性的set和get來(lái)達(dá)到定義屬性的效果;

三、方法替換:使用class_getInstanceMethod獲取到替換和被替換的方法實(shí)例,如果替換和被替換方法都已經(jīng)存在已所屬頁(yè)面,那么直接用method_exchangeImplementations交換已經(jīng)獲取到的兩個(gè)方法實(shí)例即可,若是需要用新方法替換需要class_addMethod先添加進(jìn)runtime里,再替換class_replaceMethod;

        letAS =Selector(("aaa"))

        letBS =#selector(tihuanM)

        let AAA = class_getInstanceMethod(OrderList.self, AS)

        let BBB = class_getInstanceMethod(ViewController.self, BS)

        let didAddMethod = class_addMethod(OrderList.self, AS, method_getImplementation(BBB!), method_getTypeEncoding(BBB!))

        ifdidAddMethod

        {

            class_replaceMethod(ViewController.self, BS, method_getImplementation(AAA!), method_getTypeEncoding(AAA!))

        }

        else

        {

            method_exchangeImplementations(AAA!, BBB!)

        }

    @objc func tihuanM()    {        print("tttt")    }

如果不想寫新方法 可以使用class_replaceMethod :imp_implementationWithBlock 直接把實(shí)現(xiàn)寫在block里
四、總結(jié)一下runtime可以使用的范圍 引用他人圖片


截屏2020-04-1311.03.06.png
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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