runtime结合category和block动态增加方法以及属性
2016-07-17 17:12
441 查看
objective-c中,可以在不修改源码的基础上增加方法,或者动态增加属性:
用到的是runtime中的东西:
示例:
下面先code一个动态为vc的button添加事件的例子:
扩展UIButton
UIButton+block.h文件
UIButton+block.m文件
VC中使用:
接下来,动态为UIButton增加属性:
扩展UIButton
UIButton+block.h文件
UIButton+block.m文件
然后可以像UIButton的其他属性一样使用
用到的是runtime中的东西:
// 设置 // id object 源对象 -指定我们需要绑定的对象,e.g ,给UIButton添加事件,给Class加属性 // const void *key 设置一个静态常亮,也就是Key 值,通过这个我们可以找到我们关联对象的那个数据值 // id value 关联的对象,e.g 添加的事件或者属性 // objc_AssociationPolicy policy 关联的策略 objc_setAssociatedObject(<#id object#>, <#const void *key#>, id value, <#objc_AssociationPolicy policy#>); // 获取 // 得到的是关联的对象 objc_getAssociatedObject(<#id object#>, <#const void *key#>)
示例:
static char overviewKey; NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil]; //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁 NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"]; objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN); [overview release]; //(1) overview仍然是可用的 [array release]; //(2)overview 不可用 // 想获取overview NSString * overview = objc_getAssociatedObject(self, &overviewKey);
下面先code一个动态为vc的button添加事件的例子:
扩展UIButton
UIButton+block.h文件
#import <UIKit/UIKit.h> #import <objc/runtime.h> // 用block传递事件 typedef void(^ButtonBlock)(NSInteger index); @interface UIButton (Block) // 传递block - (void)ActionWithBlock:(ButtonBlock) block; @end
UIButton+block.m文件
#import "UIButton+Block.h" static const char btnKey; @implementation UIButton (Block) - (void)ActionWithBlock:(ButtonBlock) block { if (block) { // 动态为UIButton关联block objc_setAssociatedObject(self, &btnKey, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } [self addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside]; } // 点击事件中执行动态关联的block,实现 动态增加方法 - (void)action:(UIButton *)sender { ButtonBlock block = objc_getAssociatedObject(self, &btnKey); block(sender.tag); } @end
VC中使用:
// 添加正常button点击事件 [_btn addTarget:self action:@selector(action) forControlEvents:UIControlEventTouchUpInside]; // 动态增加的button点击事件 [_btn ActionWithBlock:^(NSInteger index) { NSLog(@"点击了第%ld个按钮", index); }]; - (void)action { NSLog(@"正常的点击事件"); }
接下来,动态为UIButton增加属性:
扩展UIButton
UIButton+block.h文件
#import <UIKit/UIKit.h> #import <objc/runtime.h> @interface UIButton (Block) // 动态增加属性 @property (strong, nonatomic) UIImage *drImg; @end
UIButton+block.m文件
#import "UIButton+Block.h" static const char propertyKey; @implementation UIButton (Block) #pragma mark - #pragma mark 动态增加属性 - (void)setDrImg:(UIImage *)drImg { objc_setAssociatedObject(self, &propertyKey, drImg, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (UIImage *)drImg { return objc_getAssociatedObject(self, &propertyKey); } @end
然后可以像UIButton的其他属性一样使用
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题