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基础 一.简单说明 一般情况下,点击某个控件后,会做出相应反应的都是按钮 按钮的功能比较多,既能显示文字,又能显示图片,还能随时调整内部图片和文字的位置 二.按钮的三种状 ...
随机推荐
- redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题
先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...
- jQuery jsonp无法捕获404、500状态错误
转载:http://www.cnblogs.com/pao8041/p/4750403.html 不过上面的这个我用的不好,下次有机会用
- CSS3自动添加省略号
text-overflow:ellipsis; white-space:nowrap; overflow:hidden; 不换行,一行显示溢出时,文本自动换行.以前都是js计算的,现在可好. elli ...
- SharePoint 读取 Site Columns 的数据并绑定到DropdownList
public void GetSiteColumns(DropDownList ddl, String siteColumn) { var fields = new SPSite(ProjectCon ...
- 1008win7与虚拟机中的linux共享文件的(详细)方法
转自http://jingyan.baidu.com/article/ca00d56c74dde4e99eebcfd2.html 好东西一起分享 win7与虚拟机中的linux共享文件的(详细)方法 ...
- 【转】JSP使用上传文件,并生产高清缩略图示例
原文地址:http://blog.csdn.net/yakson/article/details/9875731 前言 刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下js ...
- 关于使用 lua 脚本抢红包
1 java代码 package com.robert.RedisTest; import redis.clients.jedis.Jedis; public class RedisClient { ...
- 【BZOJ 3053】The Closest M Points
KDTree模板,在m维空间中找最近的k个点,用的是欧几里德距离. 理解了好久,昨晚始终不明白那些“估价函数”,后来才知道分情况讨论,≤k还是=k,在当前这一维度距离过线还是不过线,过线则要继续搜索另 ...
- ES6新特性:增加新类型:Symbol
本文所有Demo的运行环境都为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : ES6新增了一种数据类型:Symbol,Symbol是用来定义对象的唯一属性名的不 ...
- java -日期
package com.qinghuainvest.tsmarket.util; import java.text.ParseException; import java.text.SimpleDat ...