iOS - 利用runtime加深对基础知识的理解
利用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加深对基础知识的理解的更多相关文章
- iOS利用Runtime自定义控制器POP手势动画
前言 苹果在iOS 7以后给导航控制器增加了一个Pop的手势,只要手指在屏幕边缘滑动,当前的控制器的视图就会跟随你的手指移动,当用户松手后,系统会判断手指拖动出来的大小来决定是否要执行控制器的Pop操 ...
- ios 利用runtime任性跳转
在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...
- iOS中利用 runtime 一键改变字体
1.准备 我们新建一个项目名叫ChangeFont,然后我就随便找了个名叫loveway.ttf的字体库拖进去,里面的工程目录大概就是这样的 目录 现在我们就简单的直接在storyboard上拖了一个 ...
- ios开发runtime学习五:KVC以及KVO,利用runtime实现字典转模型
一:KVC和KVO的学习 #import "StatusItem.h" /* 1:总结:KVC赋值:1:setValuesForKeysWithDictionary实现原理:遍历字 ...
- iOS:runtime最全的知识总结
runtime 完整总结 好东西,应该拿出来与大家分享... 南峰子博客地址:http://southpeak.github.io/blog/categories/ios/ 原文链接:http://w ...
- iOS运用runtime全局修改UILabel的默认字体
iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...
- iOS开发-Runtime详解
iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [recei ...
- 关于iOS的runtime
runtime是一个很有意思的东西,如果你学iOS开发很经常就会用到或被问到runtime.那么runtime是什么呢,如何去了解它. runtime:中文名 运行时,系统在编译时留下的一些 类型,操 ...
- iOS开发UI篇—Button基础
iOS开发UI篇—Button基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...
随机推荐
- 正式版/免费版 Xamarin 体验与拥抱
感谢MS, 感谢老纳.终于把 Xamarin 这个磨人的小妖精给收了,在也不用向大神要破解补丁了, 终于可以光明正大的使用了!! 跟据实践, 如果你们想体验一下 .NET 开发 IOS /Androi ...
- Bootstrap系列 -- 41. 带表单的导航条
有的导航条中会带有搜索表单,在Bootstrap框架中提供了一个“navbar-form”,使用方法很简单,在navbar容器中放置一个带有navbar-form类名的表单.navbar-left”让 ...
- 【对noip结束后一个月内的总结】
最近在刷一些树结构,但发现没有一个提纲,觉得有点不知所措,经常学完一个就发现还有比它更好的,而且比较耗时间.于是沙茶准备按顺序刷bzoj的省选题,看看效果怎么样……求大神指教
- json数据转换失败json_last_error int(4)
最近在程序中使用json_decode($data,true);转换失败, 并且使用 json_last_error();方法返回最后一次转换的错误,json_last_error();返回int(4 ...
- eclipse技巧总结
如果遇到错误或警告,先试试统一的方法:在problems view中,右键error或者warnning,选择quick fix serial ID并不常用,如果不实现它,eclipse会给出一 ...
- Rectangles Area Sum
#include<iostream> #include<stdio.h> #include<math.h> #include<string.h> #in ...
- java设计优化--代理模式
代理模式使用代理对象完成用户的请求,屏蔽用户对真实对象的访问. 代理模式的用途很多,比如因为安全原因,需要屏蔽客户端直接访问真实对象:或者在远程调用中,需要使用代理对象处理远程方法中的技术细节:或者为 ...
- 一个Activity掌握Design新控件 (转)
原文地址:http://blog.csdn.net/lavor_zl/article/details/51295364 谷歌在推出Android5.0的同时推出了全新的设计Material Desig ...
- Eclipse导入 appcompat,design兼容包
从Android studio推出1.0正式版后,就一直在as上开发项目,但是最近要测试一个项目,是eclipse结构,导入as后,是各种报错信息,决定改成eclipse. 其中项目中用到了ppcom ...
- 关于php插件pdo_mysql的安装
今天在做一个商城的连接的时候,需要MpDO验证.需要安装pdo_mysql模块,刚开始按照php扩展模块的安装按照这个安装ZIP,curl都成功了但是安装pdo_mysql却不行,在./configu ...