zoukankan      html  css  js  c++  java
  • 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。这个方法的使用方法可以查阅一下官方文档,在表面上,和在类里添加一个成员变量所需要的参数差不多。

  • 相关阅读:
    Hsqldb中设置主键,并让主键自增
    解决Hsqldb指针只能单向移动,不能回滚问题(.first())
    MySql服务的启动和停止
    jetty和tomcat比较
    查看某一端口被什么程序占用
    小程序修改swiper小圆点
    小程序返回上一页。或者某一页上刷新返回页
    小程序或者vue商品秒杀倒计时
    小程序 wx.switchTab 不能带参数的解决办法
    微信小程序倒计时60S
  • 原文地址:https://www.cnblogs.com/breezemist/p/5189360.html
Copyright © 2011-2022 走看看