利用runtime给分类添加属性

在分类中利用@property添加属性,只能声明实例变量的存取声明,而没有存取方法的实现,可以利用runtime实现。

在头文件中定义属性

@property (nonatomic, copy)NSString *name;

在.m文件中实现存取方法

static char *key = "name";

- (NSString *)name

{

// 根据关联的key,获取关联的值。

return objc_getAssociatedObject(self, key);

}

- (void)setName:(NSString *)name

{

// 第一个参数:给哪个对象添加关联

// 第二个参数:关联的key,通过这个key获取

// 第三个参数:关联的value

// 第四个参数:关联的策略

objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

时间: 2024-11-13 00:18:45

利用runtime给分类添加属性的相关文章

快速上手Runtime(二)之给分类添加属性

我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间. Runtime给分类添加属性步骤 1.在分类的.h文件中声明想要定义的属性 2.在分类的.m文件中实现getter和setter方法 3.引入runtime头文件,然后在setter方法中用objc_setAssociatedObject关联对象 比如给N

OC对象给分类添加属性

OC对象中不能给分类添加属性,但是在实际开发中,经常为了更好的性能需要给分类添加属性,那么 添加的属性不能有默认的成员变量,需要我们自己实现set和get方法,要用到运行时 如下: #import <objc/runtime.h> //运行时的关联对象,动态添加属性 const void *URLStringKey = "URLStringKey"; //set方法 - (void)setUrlStr:(NSString *)urlStr { objc_setAssocia

Objective-C 给分类添加“属性”——关联对象

给分类添加"属性" 咱们知道,分类中可以添加方法,却无法添加属性.那咱们有其他的方法来实现吗? 先来看看下面这段代码: @interface UIView (nl_Frame) @property (nonatomic, assign) CGFloat nl_width; @end @implementation UIView (nl_Frame) - (void)setNl_width:(CGFloat)nl_width { CGRect frame = self.frame; fr

通过运行时动态给分类添加属性

#import <UIKit/UIKit.h> /** iOS 开发中,分类默认不允许保存属性 如果在分类中,定义一个属性,需要自己实现 getter & setter 方法,而且没有 _成员变量 如果在自己开发的框架中,希望在分类中动态添加属性,可以通过 OC 运行时的关联对象的功能! 运行时非常重要的一个应用:给分类动态添加属性,结果能够让框架包装的更好,让使用者做出最小的修改! */ @interface UIImageView (WebImage) @property (non

分类添加属性之关联引用

分类是不能合成属性的,因为合成属性会生成对应的实例变量,而分类是不允许添加实例变量的(实例变量所在内存区域已初始化为不可更改,无法在动态运行时修改之). 虽然不能增加实例变量,但是添加属性还是可以的,只不过需要自己在分类中实现get和set方法,同时标记属性为动态获取. 其中一种方法叫做关联引用,实现了用存取器来访问属性,当然实际上并没有实例变量,所以本质上只不过是增加了两个方法而已. 首先在.h中声明属性: #import <UIKit/UIKit.h> @interface UIViewC

Runtime 实现 动态添加属性

利用动态加载为对象添加一个 block 点击属性; .h 文件 1 #import <UIKit/UIKit.h> 2 3 @interface UIView (Tap) 4 /** 5 * 动态添加手势 6 */ 7 - (void)setTapActionWithBlock:(void (^)(void))block ; 8 @end .m 文件 1 #import "UIView+Tap.h" 2 #import <objc/runtime.h> 3 /*

给分类(Category)添加属性

遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.setter方法.有没有解决方案呢?有,通过运行时建立关联引用.接下来以添加一个这样的属性为例: @property (nonatomic, copy) NSString *str; 1.引入运行时头文件. #import <objc/runtime.h> 2.在匿名分类或者头文件中添加属性.区别是

如何再分类中添加属性

1 #import <UIKit/UIKit.h> 2 3 typedef enum { 4 HMImageDirectionLeft, // 左边 0 5 HMImageDirectionRight,// 右边 1 6 } HMImageDirection; 7 8 9 @interface UIImage (Extension) 10 // x值 11 @property(nonatomic,assign) CGFloat x; 12 // y值 13 @property(nonatomi

为一个类动态的添加属性

/* 1不想集成一个类添加属性,想动态的添加一个属性 */ ||解决步骤 1.新建一个分类,导入 #import <objc/runtime.h> 2.添加属性(添加的属性,只是做了声明,并没有帮我们生成set,get方法) 3.手动添加set,get方法 {1.在set方法中实现 /* *@object 为那个对象添加属性 *@key  添加一个对应的key  c语言类型的 *@value  对应的值 *@objc_AssociationPolicy  策略 */ objc_setAssoc