iOS开发 Runtime使用大全(二)
来源:互联网 发布:买隐形眼镜必知常识 编辑:程序博客网 时间:2024/05/21 22:52
继续上一篇
2.添加属性
一般情况下,使用Category只能添加方法,不过使用runtime就可以添加属性。
@interface NSObject (Category)//因为需要运行时添加策略,所以这里不写@property NSString *name;@end
#import "NSObject+Category.h"#import <objc/runtime.h>@implementation NSObject (Category)-(void)setName:(NSString *)name{ //源对象 //key //关联对象 //关联策略 weak、strong,redonly等 objc_setAssociatedObject(self, "WenCheng", name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}-(NSString *)name{ //返回指定键的关联对象的值 //self:关联源对象 //“name”:关联的key return objc_getAssociatedObject(self, "WenCheng");}@end
3.交换方法
// 得到类的实例方法// class_getInstanceMethod// 得到类的类方法// class_getClassMethod Method oldMethod = class_getInstanceMethod([self class], @selector(viewWillAppear:)); Method newMethod = class_getInstanceMethod([self class], @selector(addFind));//交换 method_exchangeImplementations(oldMethod, newMethod);
项目中使用
1.按钮点击间隔
创建Category,添加“时间间隔”和“是否可点击”。
@interface UIButton (JC)@property (nonatomic,assign) NSTimeInterval jc_clickInterval;//添加点击事件的间隔时间@property (nonatomic, assign) BOOL jc_isIgnoreClick;//是否忽略点击事件,不响应点击事件@end
static const char *JC_clickInterval = "JC_clickInterval";static const char *JC_ignoreClick = "JC_ignoreClick";#pragma mark - 写get和set方法-(NSTimeInterval)jc_clickInterval{ return [objc_getAssociatedObject(self, JC_clickInterval) doubleValue];}-(void)setJc_clickInterval:(NSTimeInterval)jc_clickInterval{ objc_setAssociatedObject(self, JC_clickInterval, @(jc_clickInterval), OBJC_ASSOCIATION_RETAIN_NONATOMIC);}-(BOOL)jc_isIgnoreClick{ return [objc_getAssociatedObject(self, JC_ignoreClick) boolValue];}-(void)setJc_isIgnoreClick:(BOOL)jc_isIgnoreClick{ objc_setAssociatedObject(self, JC_ignoreClick, @(jc_isIgnoreClick), OBJC_ASSOCIATION_RETAIN_NONATOMIC);}#pragma mark - 拦截点击事件+(void)load{ Method old = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:)); Method new = class_getInstanceMethod(self, @selector(jcSendAction:to:forEvent:)); method_exchangeImplementations(old, new);}#pragma mark - 判断是否可以点击- (void)jcSendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent *)event{ if (self.jc_isIgnoreClick) return; if (self.jc_clickInterval > 0) { self.jc_isIgnoreClick = YES; //多少秒后调用方法 [self performSelector:@selector(setJc_isIgnoreClick:) withObject:@(NO) afterDelay:self.jc_clickInterval]; } //调用原方法 [self jcSendAction:action to:target forEvent:event];}
阅读全文
0 0
- iOS开发 Runtime使用大全(二)
- iOS开发 Runtime使用大全(一)
- iOS开发 runtime使用场景
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS 高级开发 runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- IOS高级开发~Runtime(二)
- iOS开发中runtime的使用
- IOS Runtime(二)
- iOS runtime(二)
- iOS Runtime (二)
- iOS runtime(二)
- IOS高级开发~Runtime
- 垃圾陷阱
- 【生成器】PHP的生成器yield【原创】
- VGA控制的verilog模块设计
- 二分查找,背包问题v3
- 每日一刷——合并有序链表&&求n个数的和
- iOS开发 Runtime使用大全(二)
- Mac OS X 系统配置 Apache+MySql+PHP 详细教程
- 使用GDB在ARM上进行开发调试
- 算法系列——Perfect Squares
- GDOI7.6~7.15模拟总结
- Android常用控件(Widget)
- [bzoj3064]Tyvj 1518 CPU监控 线段树&排行榜垫底留念
- Tensorflow Save
- ContentProvider工作机制