利用runtime加深对基础知识的理解

如果对runtime需要学习,可以看这篇,以下仅作为学习笔记,相互交流。

runtime的头文件:

#import <objc/runtime.h> //*> 对方法、变量、属性和类别的方法
#import <objc/message.h> //*> 消息转发的方法

1.获取OC类的变量名、属性名、方法

首先介绍三个函数:
class_copyIvarList()
class_copyPropertyList()
class_copyMethodList()
警告:使用以上三个方法没用的时候必须要free()掉。通过下面代码进行分析


/*
    首先,创建集成NSObject的Person对象,然后在Person.h写入:

    @interface People : NSObject
            @property (nonatomic, strong) NSString * name;
            @property (nonatomic, assign) BOOL Number;
    @end

    然后在AppDelegate.m写入一下代码,进行测试。

*/

    unsigned int count  = 0;
    unsigned int count2 = 0;
    unsigned int count3 = 0;

    Ivar * ivars                = class_copyIvarList([People class], &count);
    Method * methods            = class_copyMethodList([People class], &count2);
    objc_property_t * propertys = class_copyPropertyList([People class], &count3);

    for (int i = 0; i < count; i++)
    {
        Ivar ivar = ivars[i];
        const char * ivarname = ivar_getName(ivar);
        NSString * key = [NSString stringWithUTF8String:ivarname];
        NSLog(@"%@",key);
    }

    NSLog(@"\n");
    for (int i = 0; i < count3; i++)
    {
        objc_property_t property = propertys[i];
        const char * propertyname = property_getName(property);
        NSString * key = [NSString stringWithUTF8String:propertyname];
        NSLog(@"%@",key);
    }

    NSLog(@"\n");
    for (int i = 0; i< count2; i++)
    {
        Method method = methods[i];
        SEL methodname = method_getName(method);
        NSString * key = NSStringFromSelector(methodname);
        NSLog(@"%@",key);
    }
//    free(ivars);
//    free(methods);
//    free(propertys);
/*
    如果不写上面三行free(),就会出现内存泄露,如下图
*/


打印结果:


2016-03-23 14:39:56.167 测试1[2491:974748] _Number
2016-03-23 14:39:56.168 测试1[2491:974748] _name
2016-03-23 14:39:56.168 测试1[2491:974748]
2016-03-23 14:39:56.168 测试1[2491:974748] name
2016-03-23 14:39:56.168 测试1[2491:974748] Number
2016-03-23 14:39:56.168 测试1[2491:974748]
2016-03-23 14:39:56.169 测试1[2491:974748] Number
2016-03-23 14:39:56.169 测试1[2491:974748] .cxx_destruct
2016-03-23 14:39:56.170 测试1[2491:974748] dealloc
2016-03-23 14:39:56.170 测试1[2491:974748] name
2016-03-23 14:39:56.170 测试1[2491:974748] setName:
2016-03-23 14:39:56.170 测试1[2491:974748] init
2016-03-23 14:39:56.171 测试1[2491:974748] setNumber:

iOS - 利用runtime加深对基础知识的理解的更多相关文章

  1. iOS利用Runtime自定义控制器POP手势动画

    前言 苹果在iOS 7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操 ...

  2. ios 利用runtime任性跳转

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  3. iOS中利用 runtime 一键改变字体

    1.准备 我们新建一个项目名叫ChangeFont,然后我就随便找了个名叫loveway.ttf的字体库拖进去,里面的工程目录大概就是这样的 目录 现在我们就简单的直接在storyboard上拖了一个 ...

  4. ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型

    一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...

  5. iOS:runtime最全的知识总结

    runtime 完整总结 好东西,应该拿出来与大家分享... 南峰子博客地址:http://southpeak.github.io/blog/categories/ios/ 原文链接:http://w ...

  6. iOS运用runtime全局修改UILabel的默认字体

    iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...

  7. iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...

  8. 关于iOS的runtime

    runtime是一个很有意思的东西,如果你学iOS开发很经常就会用到或被问到runtime.那么runtime是什么呢,如何去了解它. runtime:中文名 运行时,系统在编译时留下的一些 类型,操 ...

  9. iOS开发UI篇—Button基础

    iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...

随机推荐

  1. ASP.NET MVC3入门教程之第一个WEB应用程序

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=91&extra=page%3D1 上一节,我们已经搭建好了AS ...

  2. JAVA GC 简单总结

    GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...

  3. 11-cp 命令总结

  4. navigationView 的使用和布局文件的绑定

    今天项目进行到了细化内容的部分啦- 需要美化侧滑菜单,并且填充数据.在博客上看了好久发现大家的都大同小异 而且很少有提到如何绑定内容各处求助终于在一片博客上发现了蛛丝马迹!!上大神的帖子:blog.c ...

  5. android 监听短信并发送到服务器

    1. 接受系统的短信广播,操作短信内容. 优点:操作方便,适合简单的短信应用. 缺点:来信会在状态栏显示通知信息. 2. 应用观察者模式,监听短信数据库,操作短信内容.   实例如下: SystemE ...

  6. Python:no encoding declared 错误

    使用Python编译的时候出现如下错误: SyntaxError: Non-ASCII character ‘\xe5’ in file magentonotes.com.py on line 2, ...

  7. java 时间操作

    设置获取时间日期格式 // 设置日期格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); // 为 ...

  8. [转]使用Sencha Ext JS 6打造通用应用程序

    原文地址:http://www.uedsc.com/using-sencha-ext-js-6-to-build-universal-apps.html 在Sencha和整个Ext JS团队的支持下, ...

  9. jQ1.5中的事件系统(低版本的事件系统)

    jQ的一个个版本事系统都在修正着bug和不断优化, 而且看了事件系统对事件的兼容更加熟悉, 更加了解jQ内部的事件机制. 因为jQ对事件系统引入了事件命名空间,事件的代理, 事件的手动触发,事件描述等 ...

  10. 素数筛 poj 3518

    给你一个n 求包括n的一个非素数区间有多长 +1输出 #include<stdio.h> #include<string.h> #include<algorithm> ...