OC中的分类只能添加方法,没有办法新增属性,但是有时候我们需要给分类新增属性,我们可以通过runtime实现。
Runtime
.h文件中,声明一个属性name,利用runtime的对象关联技术,在.m中重写他的set,get方法。
#import <objc/runtime.h>
//申明一个
-(void)setName:(NSString *)name {
/*
objc_AssociationPolicy参数使用的策略:
OBJC_ASSOCIATION_ASSIGN; //assign策略
OBJC_ASSOCIATION_COPY_NONATOMIC; //copy策略
OBJC_ASSOCIATION_RETAIN_NONATOMIC; // retain策略
OBJC_ASSOCIATION_RETAIN;
OBJC_ASSOCIATION_COPY;
*/
/*
关联方法:
objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
参数:
* id object 给哪个对象的属性赋值
const void *key 属性对应的key
id value 设置属性值为value
objc_AssociationPolicy policy 使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
*/
objc_setAssociatedObject(self, stringKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name {
return objc_getAssociatedObject(self, stringKey);
}
利用该技术,可以实现app中个人界面通常需要取消导航栏的需求,以往我们的做法是隐藏导航栏,但是这样会出现各种问题,动画效果不好的情况,利用runtime我们可以设置导航栏的subViews的透明度。github有大神写的demo,这里贴出地址,学习学习。
https://github.com/Cloudox/SmoothNavDemo
该笔记借鉴了大神的文章,也贴一下
http://www.cocoachina.com/ios/20170331/18944.html
网友评论