美文网首页
给类别加属性runtime

给类别加属性runtime

作者: crzios123 | 来源:发表于2018-11-13 19:42 被阅读0次

遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、setter方法。查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter、setter方法。有没有解决方案呢?有,通过运行时建立关联引用。接下来以添加一个这样的属性为例:

@property (nonatomic, copy) NSString *str;

1.引用运行时头文件。

#import <objc/runtime.h>

2.在匿名分类或者头文件中添加属性。区别是:匿名分类中添加的是私有属性,只在本类中可以使用,类的实例中不可以使用。头文件中添加的在类的实例中也可以使用。

//分类的头文件

@interface ClassName (CategoryName)

//我要添加一个实例也可以访问的变量所以就写在这里了

@property (nonatomic, strong) NSString *str;

@end

//匿名分类

@interface ClassName ()

@end

3、在实现里面写要添加属性的getter、setter方法。

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

objc_setAssociatedObject(self, &strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

return objc_getAssociatedObject(self, &strKey);

}

@end

在setStr:方法中使用了一个objc_setAssociatedObject的方法,这个方法有四个参数,分别是:源对象,关联时的用来标记是哪一个属性的key(因为你可能要添加很多属性),关联的对象和一个关联策略。

用来标记是哪一个属性的key常见有三种写法,但代码效果是一样的,如下:

//利用静态变量地址唯一不变的特性

1、static void *strKey = &strKey;

2、static NSString *strKey = @"strKey";

3、static char strKey;

关联策略是个枚举值,解释如下:

enum {

OBJC_ASSOCIATION_ASSIGN = 0, //关联对象的属性是弱引用

OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, //关联对象的属性是强引用并且关联对象不使用原子性

OBJC_ASSOCIATION_COPY_NONATOMIC = 3, //关联对象的属性是copy并且关联对象不使用原子性

OBJC_ASSOCIATION_RETAIN = 01401, //关联对象的属性是copy并且关联对象使用原子性

OBJC_ASSOCIATION_COPY = 01403 //关联对象的属性是copy并且关联对象使用原子性

};

4、完成后的整体代码如下:

.h文件

//分类的头文件

@interface ClassName (CategoryName)

@property (nonatomic, strong) NSString *str;

@end

.m文件

//实现文件

#import "ClassName + CategoryName.h"#importstatic void *strKey = &strKey;

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

return objc_getAssociatedObject(self, &strKey);

}

@end

相关文章

  • iOS 关联对象

    关联对象简单的说就是运用oc语言的运行时特性(runtime),给类别加属性(当然不止加属性).正常的类中创建一个...

  • 给类别加属性runtime

    遇到一个问题,写了一个分类,但原先类的属性不够用。添加一个属性,调用的时候崩溃了,说是找不到getter、sett...

  • runtime简单使用之动态添加属性

    runtime简单使用之给系统类动态添加属性 前言 1, 给类动态添加属性,实质就是让一个属性与某个对象产生关联的...

  • iOS底层原理 - Runtime-03

    Runtime API - 类 Runtime API – 成员变量 Runtime API – 属性 Runt...

  • 04 runtime用法之动态添加属性和字典转模型

    1 动态添加属性 若想给系统的类添加属性,可以采用Runtime的方法,比如:给系统的NSObject类添加一个n...

  • 遍历Model类的属性

    iOS~遍历Model类的属性并完善使用Runtime给Model类赋值 一、获取Model的实体属性 1.要想遍...

  • runtime相关

    修改系统方法 动态添加方法 动态给系统类添加属性(给分类添加属性) runtime+kvc 转换模型

  • 阅读MJRefresh源码学到的知识点

    1.利用Runtime给category中增加属性 category可以访问类中的已有的属性,但不能新增加属性。使...

  • iOS高级开发runtime那点事实战(1)

    runtime 给类别添加属性浅析 很多时候因为需求想着给一个类添加属性,就是给一个类添加成员变量了,这样子方便了...

  • 动态添加属性

    动态添加属性:什么时候需要动态添加属性? 开发场景:给系统的类添加属性的时候,可以使用runtime动态添加属性方...

网友评论

      本文标题:给类别加属性runtime

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