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基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...
随机推荐
- IDEA 13 无法进入debug 模式解决方案
1.最近在idea中使用tomcat开发项目,像往常一样打开tomcat进行debug,但奇怪的事情出现了,项目根本不进断点.后查找原因,估计idea的加载参数方式是:先加载tomcat中设置的参数, ...
- unity3d CarWaypoints插件
编写初衷: 1.网上没有现成的好用的waypoints插件 2.自己在做一个赛车游戏,如果没有这款插件的话在制作游戏的过程中会被累成狗 3.从来没有接触过插件方面的东西,所以想自己尝试一下 插件用途: ...
- HTML5+JS 《五子飞》游戏实现(七)游戏试玩
前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:ht ...
- 千呼万唤岂出来,写款软件不容易——Visual Entity 2.0 发布
在各位用户不继的催更中,终于完成了这次更新.Visual Entity这个软件发布于 2011年,这个软件完成后,便上班去了,也没有做什么推广工作.所以知道的用户并不多,尽管它是个非常好用.并且免费的 ...
- Dapper Vs Dbentry
公司项目数据库访问采用的dapper,以前没有用过.今天简单的测试下了,dapper和dbentry 查询效率情况. public ActionResult Test() { Sys_UserFaca ...
- 20160223 - Windows 10 的文件资源管理器下出现重复文件夹的解决办法
现象: 安装 OneDrive 从 Windows 7.8.8.1 升级来的 Windows 10 的电脑,可能会出现文件资源管理器左侧面板中出现重复的文件夹. 通常有:视频.图片.文档.下载.音频. ...
- Swift&NodeJS 使用Alamofire进行Post(zhuan)
这篇博客主要实现Swift客户端和NodeJS后台的Post.Get请求实现. 我是一个略有点讨厌重复使用工具的人,比如这些基本功能完全可以用OC和PHP等替代,但是没办法,现在知识更新的太快啦,Sw ...
- 9-cat 简明笔记
连接或显示文件 cat [options] [file-list] 参数 file-list 是cat要处理的单个文件路径名或多个文件路径名列表,如果不指定任何参数或指定一个连字符(-)代替文件名,c ...
- ListView适配器获取布局文件作为View的三种方式
第一种方法: public View getView(int position, View convertView, ViewGroup parent) { View view = null; if ...
- 导入dmp文件时的注意事项
来源于:http://bbs.csdn.net/topics/350167817 --1表空间 CREATE TABLESPACE newjw DATAFILE 'E:\oracle_data\new ...