iOS 在类别里添加成员变量的方法:objc_setAssociatedObject

时间:2024-06-20 13:04:08

今天在github上查看MJPopupViewController这个项目,发现里面用到了objc_setAssociatedObject,用来为类别添加成员变量。

我百度之后,发现有人是这样说明的:

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用它必须使用<objc/runtime.h>的头文件,然后就可以*使用objc_getAssociatedObject以及objc_setAssociatedObject。

如果我们在类里使用了

@property (nonatomic, retain) UIViewController *mj_popupViewController;

@property (nonatomic, retain) MJPopupBackgroundView *mj_popupBackgroundView;

那么,编译器自动会为我们生成对应的变量,而且会生成访问方法。但是,如果我们在category里这样使用:

@interface UIViewController (MJPopupViewController)

@property (nonatomic, retain) UIViewController *mj_popupViewController;
@property (nonatomic, retain) MJPopupBackgroundView *mj_popupBackgroundView;@end

编译器是不会生成变量的!category 就是为了加入新的方法用的。

那么,我们能不能使用@synthesize 在Category的实现里生成get 和 set 方法呢?看以下测试截图:

iOS 在类别里添加成员变量的方法:objc_setAssociatedObject

语法是不允许的!

所以说,对于category,是无法静态的添加成员变量的。只能使用系统提供的动态的添加方法,objc_setAssociatedObject。这个方法的使用方法可以查阅一下官方文档,在表面上,和在类里添加一个成员变量所需要的参数差不多。