iOS開發日記18-runtime進階篇,ios日記18-runtime

來源:互聯網
上載者:User

iOS開發日記18-runtime進階篇,ios日記18-runtime

 今天博主有一個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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.