通过runtime给分类添加属性

2017-09-06  本文已影响9人  loghm

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

上一篇下一篇

猜你喜欢

热点阅读