美文网首页iOS 精美收藏iOS技能iOS
iOS分类中通过runtime添加动态属性

iOS分类中通过runtime添加动态属性

作者: 奋斗的菜鸟 | 来源:发表于2015-08-11 17:50 被阅读12731次
  • 首先定义一个类
#import@interface Person : NSObject
@property (assign, nonatomic) NSInteger age;
-(void)run;
@end

#import "Person.h"
@implementation Person
-(void)run{
    NSLog(@"%s",__func__);
}
@end
  • 定义分类
#import "Person.h"
@interface Person (PersonExtention)
@property (copy, nonatomic) NSString *name;
-(void)saySex;
@end
#import "Person+PersonExtention.h"
#import <objc/runtime.h>
@implementation Person (PersonExtention)
//定义常量 必须是C语言字符串
static char *PersonNameKey = "PersonNameKey";
-(void)setName:(NSString *)name{
    /*
    OBJC_ASSOCIATION_ASSIGN;            //assign策略
    OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
    OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略

    OBJC_ASSOCIATION_RETAIN;
    OBJC_ASSOCIATION_COPY;
     */
     /*
     * id object 给哪个对象的属性赋值
       const void *key 属性对应的key
       id value  设置属性值为value
       objc_AssociationPolicy policy  使用的策略,是一个枚举值,和copy,retain,assign是一样的,手机开发一般都选择NONATOMIC
          objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     */

    objc_setAssociatedObject(self, PersonNameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)name{
    return objc_getAssociatedObject(self, PersonNameKey);
}
-(void)saySex{
    NSLog(@"%s----%@",__func__,self);
}

@end

总结:在分类中@property不会生成_变量,也不会实现getter和setter方法,我们可以手动实现如下

-(NSString *)name{
    return @"name";
}
-(void)setName:(NSString *)name{
    
}

但是这样是没什么意义的,而且分类中不允许定义变量,所以只能用runtime类实现

相关文章

网友评论

  • LD_左岸:请教下 这个Runtime的动态添加属性 有什么特殊的应用场景吗 就是非得这么干不能解决问题

    我觉得搞个子类 也是很简单的啊

    比如我给系统类UIButton 搞个分类 在分类里再@property一个属性 此时明明是不生成该属性的下划线变量 也不生成该属性的set get方法 自己用RunTime费劲巴列的给他整上

    何如直接继承自UIButton @property(nonatomic,copy)NSString * XXX;
    一句代码就OK嘛
  • IMKel:如何是布尔类型的,能添加吗
    奋斗的菜鸟:@IMKel 可以添加,策略选择OBJC_ASSOCIATION_ASSIGN,伪代码objc_setAssociatedObject(实例对象, "key", @(布尔值), OBJC_ASSOCIATION_ASSIGN)
  • 动感超人丶:如果 添加的属性是自定义的,会崩溃,怎么解决,比如给NSPerson添加NSDog属性,而不是NSString
  • 兰州一碗面:屌屌屌,学习了谢谢大神
    奋斗的菜鸟:@兰州一碗面 不敢当不敢当,只是把自己理解的写出来而已
  • 会当临绝顶山小:以前还真不知道这个,又长见识了……
  • codeing小牛:不错不错
  • 屈涯:写的不错,终于找到写的能看懂的了
  • 我是卖报滴小行家:没有看太懂,到底用的是分类还是延展啊?
    我是卖报滴小行家:@srowfly 鲸鱼?
    奋斗的菜鸟:@我不爱白开水 是Category,名字叫Extension,这里可能有点歧义,以后我会改正
    dc4f4e889415:@我不爱白开水 分类的名字叫Extension...

本文标题:iOS分类中通过runtime添加动态属性

本文链接:https://www.haomeiwen.com/subject/jupiqttx.html