iOS中为category添加@property支持

2024-05-11 07:48

本文主要是介绍iOS中为category添加@property支持,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Objective-C runtime提供了Associative References支持,也就是说每一个对象都有一个可选的dictionary字典,我们可以向其添加key/value对。

这是一个非常强大的功能,我们都知道Objective-C中支持category,我们可以在category中添加方法,但是它不允许我们添加实例变量。

通过这个Associative References我们就可以在category中添加实例变量了,但是需要指出的是这个是假的实例变量,变量实际上并不是类对象的一部分,而是存储在对象的Associative References的dictionary中;也就是说我们这样添加的变量并不改变类对象的大小。

在Objective-C runtime中提供了访问这个dictionary的方法

[代码]c#/cpp/oc代码:

1 void objc_setAssociatedObject(id objectconst void *key, id value, objc_AssociationPolicy policy)
2 id objc_getAssociatedObject(id objectconst void *key)


然后我们就来看看如何来使用Associative References为category添加property:

[代码]c#/cpp/oc代码:

01 static char kDHStyleKey;
02   
03     @interface UIView (DHStyleManager)
04     @property (nonatomic, copy) NSString* styleName;
05     @end
06   
07     @implementation UIView (DHStyleManager)
08     @dynamic styleName;
09     - (void)setStyleName:(NSString *)styleName
10     {
11         objc_setAssociatedObject(self, &kDHStyleKey, styleName, OBJC_ASSOCIATION_COPY);
12     }
13   
14     - (NSString*)styleName
15     {
16         return objc_getAssociatedObject(self, &kDHStyleKey);
17     }
18   
19     @end

也就是说我们需要利用@dynamic自己为property提供getter和setter,在getter和setter中访问Associative References

为了方便期间,可以封装一个宏来访问Associatvie References,代码如下:

[代码]c#/cpp/oc代码:

01 @interface UIView (DHStyleManager)
02     @property (nonatomic, copy) NSString* styleName;
03     @end
04      
05     @implementation UIView (DHStyleManager)
06     ADD_DYNAMIC_PROPERTY(NSString*,styleName,setStyleName);
07      
08     @end
09  
10  
11 #define ADD_DYNAMIC_PROPERTY(PROPERTY_TYPE,PROPERTY_NAME,SETTER_NAME) \
12     @dynamic PROPERTY_NAME ; \
13     static char kProperty##PROPERTY_NAME; \
14     - ( PROPERTY_TYPE ) PROPERTY_NAME \
15     { \
16         return ( PROPERTY_TYPE ) objc_getAssociatedObject(self, &(kProperty##PROPERTY_NAME ) ); \
17     } \
18     \
19     - (void) SETTER_NAME :( PROPERTY_TYPE ) PROPERTY_NAME \
20     { \
21         objc_setAssociatedObject(self, &kProperty##PROPERTY_NAME , PROPERTY_NAME , OBJC_ASSOCIATION_RETAIN); \
22     } \


参考:
http://oleb.net/blog/2011/05/faking-ivars-in-objc-categories-with-associative-references/
http://inchoo.net/mobile-development/iphone-development/how-to-add-a-property-via-class-category/
http://www.davidhamrick.com/2012/05/28/Adding-Properties-to-an-Objective-C-Category-Revisted.html

这篇关于iOS中为category添加@property支持的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978926

相关文章

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

Cannot read property ‘length‘ of null while opening vscode terminal

同一问题地址:Cannot read property ‘length’ of null while opening vscode terminal 问题描述 One day, 我在ubuntu 18.04下用vscode打开一个项目,并想和往常一样在vscode使用终端,发现报错Cannot read property 'length' of null。 解决 打开setting.jso