国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

iOS開發日記18-runtime高級篇

2019-11-14 18:20:08
字體:
來源:轉載
供稿:網友

 今天博主有一個runtime高級的需求,遇到了一些困難點,在此和大家分享,希望能夠共同進步.

 相信看了博主上一篇博文,各位對runtime都有了一定的理解,當面試官問你runtime是什么的時候,相信大家不會只說一個運行時就沒有詞了.那么當你說完了你對runtime的理解后,大部分面試官都會問你,你用過runtime嗎?

runtime是一項危險的技術,蘋果的官方文檔建議我們不要輕易使用runtime,但是最基本的用法我們還是應該掌握的,runtime的函數有很多,我們可以點入頭文件

objc/runtime.h中詳細查看

相關函數

1.  增加

增加函數:class_addMethod

增加實例變量:class_addIvar

增加屬性:@dynamic標簽,或者class_addMethod,因為屬性其實就是由getter和setter函數組成

增加PRotocol:class_addProtocol (說實話我真不知道動態增加一個protocol有什么用,-_-!!)

2.  獲取

獲取函數列表及每個函數的信息(函數指針、函數名等等):class_getClassMethod method_getName ...

獲取屬性列表及每個屬性的信息:class_copyPropertyList property_getName

獲取類本身的信息,如類名等:class_getName class_getInstanceSize

獲取變量列表及變量信息:class_copyIvarList

獲取變量的值

3.    替換

將實例替換成另一個類:object_setClass

替換類方法的定義:class_replaceMethod

4.其他常用方法:

交換兩個方法的實現:method_exchangeImplementations.

設置一個方法的實現:method_setImplementation.

 

其中最簡單的runtime應用要數用runtime查看類的屬性列表,方法列表,成員變量列表和協議列表,下面把代碼貼出來與大家分享.

    unsigned int count;

    //獲取屬性列表

    objc_property_t *propertyList=class_copyPropertyList([self class], &count);

    for (unsigned int i=0; i<count; i++) {

        const char *propertyname =property_getName(propertyList[i]);

        NSLog(@"property-----%@", [NSString stringWithUTF8String:propertyname]);

    }

    //獲取方法列表

    Method *methodList=class_copyMethodList([self class], &count);

    for (unsigned int i; i<count; i++) {

        Method method=methodList[i];

        NSLog(@"method-----%@", NSStringFromSelector(method_getName(method)));

    }

    //獲取成員變量列表

    Ivar *ivarList=class_copyIvarList([self class], &count);

    for (unsigned int i; i<count; i++) {

        Ivar myIvar=ivarList[i];

        const char *ivarName=ivar_getName(myIvar);

        NSLog(@"ivar------%@",[NSString stringWithUTF8String:ivarName]);

    }

    //獲取協議列表

    __unsafe_unretained Protocol **protocolList=class_copyProtocolList([self class], &count);

    for (unsigned int i; i<count; i++) {

        Protocol *myProtocol=protocolList[i];

        const char *protocolName=protocol_getName(myProtocol);

        NSLog(@"protocol------%@",[NSString stringWithUTF8String:protocolName]);

    }

 當然還有一些更為復雜的應用這里就不多做闡述了,下面幾個博客會讓你更加理解runtime

http://www.cocoachina.com/ios/20150901/13173.html?utm_source=tuicool

 

http://www.cocoachina.com/ios/20150907/13336.html?utm_source=tuicool

 

http://hechen.info/2015/09/07/Understanding-the-Objective-C-Runtime/?utm_source=tuicool

 

http://www.tuicool.com/articles/MvM3ie?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1

 

http://www.tuicool.com/articles/uyaAZjM?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1

 

http://www.cocoachina.com/ios/20150824/13104.html?utm_source=tuicool

 

http://www.tuicool.com/articles/q2uqAjq?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1

 

http://www.cocoachina.com/cms/wap.php?plg_nld=1&action=article&id=12540&plg_auth=1&plg_uin=1&plg_dev=1&plg_nld=1&plg_usr=1&plg_vkey=1

 

http://www.jianshu.com/p/bd24c3f3cd0a?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1

 

http://www.tuicool.com/articles/YzeiEna?plg_nld=1&plg_uin=1&plg_auth=1&plg_nld=1&plg_usr=1&plg_vkey=1&plg_dev=1


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 丹寨县| 兰考县| 辽中县| 龙岩市| 衡阳县| 怀远县| 沙湾县| 彰武县| 寿宁县| 崇仁县| 德保县| 共和县| 高碑店市| 晋江市| 长岛县| 壶关县| 海南省| 黔东| 行唐县| 望谟县| 崇仁县| 息烽县| 永嘉县| 札达县| 龙岩市| 新郑市| 紫云| 同仁县| 黔西| 长武县| 罗定市| 定西市| 天门市| 老河口市| 伊川县| 乌鲁木齐县| 赫章县| 江华| 池州市| 三门峡市| 天长市|