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

  • 相关阅读:
    Elasticsearch核心技术与实战-学习笔记
    在ABP中灵活使用AutoMapper
    使用log4net记录ABP日志
    Abp小知识-如何全局设置DontWrapResult属性
    《C#并发编程经典实例》学习笔记—2.7 避免上下文延续
    NEST 6.X升级到7.X
    django框架——十
    django——自定义分页
    django框架九
    orm数据库查询优化和数据库三大设计范式
  • 原文地址:https://www.cnblogs.com/breezemist/p/5189360.html
Copyright © 2011-2022 走看看