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


    今天在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 方法呢?看以下测试截图:

    语法是不允许的!

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

  • 相关阅读:
    放缩ImageView
    2017/5/3 afternoon
    2017/5/3 morning
    2017/5/2 afternoon
    2017/5/2 morning
    2017/4/28 afternoon
    2017/4/28 morning
    2017/4/27 afternoon
    2017/4/27 morning
    2017/4/26 afternoon
  • 原文地址:https://www.cnblogs.com/breezemist/p/5189360.html
Copyright © 2020-2023  润新知