博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios-runtime
阅读量:6428 次
发布时间:2019-06-23

本文共 3947 字,大约阅读时间需要 13 分钟。

 

git下载地址:git@github.com:lu459700780/RunTime.git

viewController.h

#import 
@interface ViewController : UIViewController@property(nonatomic,strong)NSString *hello;@property(nonatomic,strong)NSString *hello1;/** * 交换方法使用 */- (void)method1;- (void)method2;@end

viewController.m

#import "ViewController.h"#import "RunTime.h"#import "RunTime+Category.h"//项目下载地址:git@github.com:lu459700780/RunTime.git@interface ViewController ()@end@implementation ViewController-(NSString *)description{    return [NSString stringWithFormat:@"hello:%@",_hello];}- (instancetype)init{    self = [super init];    if (self) {        _hello = @"hello";    }    return self;}- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor whiteColor];    _hello = @"hello";            //获取某一个类所有属性和所有方法    [RunTime getAllPropertyAndAllMethod:[ViewController class]];    //改变某一属性值    [RunTime changeVariable];    //增加新方法    [RunTime addNewMethod];    //交换方法    [RunTime exchangeMethod];        //增加新属性    RunTime *keytool = [[RunTime alloc]init];    keytool.newVariable = @"Hello";    keytool.height = 100;    NSLog(@"%@",[keytool newVariable]);    NSLog(@"%f",[keytool height]);    }- (void)method1{    NSLog(@"method1");}- (void)method2{    NSLog(@"method2");}@end

RunTime.h

#import 
#import
@interface RunTime : NSObject/** * 获取所有成员变量和方法 * * @param myClass 类别 */+ (void)getAllPropertyAndAllMethod:(id)myClass;/** * 改变属性值 */+ (void)changeVariable;/** * 增加新方法 */+ (void)addNewMethod;/** * 交换方法 */+ (void)exchangeMethod;@end

RunTime.m

#import "RunTime.h"#import 
#import "ViewController.h"//获取屏幕宽度的宏#define ScreenWidth ([[UIScreen mainScreen] bounds].size.width)@implementation RunTime+ (void)getAllPropertyAndAllMethod:(id)myClass{ unsigned int outCount = 0; // 获取到所有的成员变量列表 Ivar *vars = class_copyIvarList([myClass class], &outCount); // 遍历所有的成员变量 for (int i = 0; i < outCount; i++) { Ivar ivar = vars[i]; // 取出第i个位置的成员变量 const char *propertyName = ivar_getName(ivar); // 获取变量名 const char *propertyType = ivar_getTypeEncoding(ivar); // 获取变量编码类型 printf("变量名%s/变量编码类型%s\n", propertyName, propertyType); } unsigned int count; //获取方法列表,所有在.m文件显式实现的方法都会被找到,包括setter+getter方法; Method *allMethods = class_copyMethodList([myClass class], &count); for(int i =0;i

  RunTime+Category.h

#import "RunTime.h"@interface RunTime (Category)/** *  增加属性(字符串类型) */@property (nonatomic,strong)NSString *newVariable;/** *  增加属性(常量) */@property (nonatomic,assign)float height;@end

 

 RunTime+Category.m

#import "RunTime+Category.h"#import 
//runtime API的使用需要包含此头文件//增加多个属性,key值不能一样const char * keytool = "keytool"; //做为key,字符常量 必须是C语言字符串;const char * keytool2 = "keytool2"; //做为key,字符常量 必须是C语言字符串;@implementation RunTime (Category)/** * 添加新属性 * * @param newVariable 新属性名 */-(void)setNewVariable:(NSString *)newVariable{ NSString *newStr = [NSString stringWithFormat:@"%@",newVariable]; /* 第一个参数是需要添加属性的对象; 第二个参数是属性的key; 第三个参数是属性的值; 第四个参数是一个枚举值,类似@property属性创建时设置的关键字,可从命名看出各含义 */ objc_setAssociatedObject([RunTime class],keytool, newStr, OBJC_ASSOCIATION_COPY_NONATOMIC);}/** * 提取属性的值 * * @return 属性值 */-(NSString *)newVariable{ NSString *myNewVariable = objc_getAssociatedObject([RunTime class], keytool); return myNewVariable;}/** * 添加新属性 * * @param height 新属性名 */-(void)setHeight:(float)height{ NSNumber *num = [NSNumber numberWithFloat:height]; /* 第一个参数是需要添加属性的对象; 第二个参数是属性的key; 第三个参数是属性的值; 第四个参数是一个枚举值,类似@property属性创建时设置的关键字,可从命名看出各含义 */ objc_setAssociatedObject([RunTime class],keytool2, num, OBJC_ASSOCIATION_COPY_NONATOMIC);}/** * 提取属性的值 * * @return 属性值 */-(float)height{ NSNumber *number = objc_getAssociatedObject([RunTime class], keytool2); return [number floatValue];}@end

 

转载于:https://www.cnblogs.com/sayimba/p/6289393.html

你可能感兴趣的文章
20140616 科技脉搏 -最大颠覆来自创业公司与边缘产业
查看>>
UVAoj 11324 - The Largest Clique(tarjan + dp)
查看>>
offsetLeft, offsetTop以及postion().left , postion().top有神马区别
查看>>
visual studio 中GIT的用法
查看>>
数据库中触发器before与after认识
查看>>
手动露天广场和立方体
查看>>
随机选择
查看>>
【Java并发编程三】闭锁
查看>>
分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法
查看>>
让你的Git水平更上一层楼的10个小贴士
查看>>
c++ string 之 find_first_not_of 源码
查看>>
mybatis中的#和$的区别
查看>>
ubuntu下搭建NDK环境
查看>>
MessageDigest简单介绍
查看>>
webpack window 使用sass来编译css样式
查看>>
D3 & Data Visualization in Ext JS
查看>>
java通过UUID生成16位唯一订单号
查看>>
001-web基本程序搭建
查看>>
函数指针和指针函数
查看>>
Intel 揭秘:如何在公有云、混合云和私有云间合理放置工作负载
查看>>