zoukankan      html  css  js  c++  java
  • 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

    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

  • 相关阅读:
    Delphi利用Windows GDI实现文字倾斜
    再学 GDI+文本输出文本样式
    GDI+在Delphi程序的应用 Photoshop色相饱和度明度功能
    GDI+图像与GDI位图的相互转换
    走进JavaWeb技术世界12:从手动编译打包到项目构建工具Maven
    走进JavaWeb技术世界11:单元测试框架Junit
    走进JavaWeb技术世界10:从JavaBean讲到Spring
    走进JavaWeb技术世界9:Java日志系统的诞生与发展
    走进JavaWeb技术世界8:浅析Tomcat9请求处理流程与启动部署过程
    随笔总和
  • 原文地址:https://www.cnblogs.com/Twisted-Fate/p/4807405.html
Copyright © 2011-2022 走看看