iOS中为category添加@property支持
2014-05-06 18:01
411 查看
Objective-Cruntime提供了AssociativeReferences支持,也就是说每一个对象都有一个可选的dictionary字典,我们可以向其添加key/value对。
这是一个非常强大的功能,我们都知道Objective-C中支持category,我们可以在category中添加方法,但是它不允许我们添加实例变量。
通过这个AssociativeReferences我们就可以在category中添加实例变量了,但是需要指出的是这个是假的实例变量,变量实际上并不是类对象的一部分,而是存储在对象的AssociativeReferences的dictionary中;也就是说我们这样添加的变量并不改变类对象的大小。
在Objective-Cruntime中提供了访问这个dictionary的方法
然后我们就来看看如何来使用AssociativeReferences为category添加property:
也就是说我们需要利用@dynamic自己为property提供getter和setter,在getter和setter中访问AssociativeReferences
为了方便期间,可以封装一个宏来访问AssociatvieReferences,代码如下:
参考:
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
这是一个非常强大的功能,我们都知道Objective-C中支持category,我们可以在category中添加方法,但是它不允许我们添加实例变量。
通过这个AssociativeReferences我们就可以在category中添加实例变量了,但是需要指出的是这个是假的实例变量,变量实际上并不是类对象的一部分,而是存储在对象的AssociativeReferences的dictionary中;也就是说我们这样添加的变量并不改变类对象的大小。
在Objective-Cruntime中提供了访问这个dictionary的方法
[代码]c#/cpp/oc代码:
1 | void objc_setAssociatedObject(id object , const void *key, |
2 | id objc_getAssociatedObject(id object , const void *key) |
[代码]c#/cpp/oc代码:
01 | static char kDHStyleKey; |
02 |
03 | @ interface UIView (DHStyleManager) |
04 | @property |
05 | @end |
06 |
07 | @implementation |
08 | @dynamic styleName; |
09 | - ( void )setStyleName:(NSString *)styleName |
10 | { |
11 | objc_setAssociatedObject(self, |
12 | } |
13 |
14 | - (NSString*)styleName |
15 | { |
16 | return objc_getAssociatedObject(self, &kDHStyleKey); |
17 | } |
18 |
19 | @end |
为了方便期间,可以封装一个宏来访问AssociatvieReferences,代码如下:
[代码]c#/cpp/oc代码:
01 | @ interface UIView (DHStyleManager) |
02 | @property |
03 | @end |
04 |
05 | @implementation |
06 | ADD_DYNAMIC_PROPERTY(NSString*,styleName,setStyleName); |
07 |
08 | @end |
09 |
10 |
11 | #define |
12 | @dynamic |
13 | static char kProperty##PROPERTY_NAME; \ |
14 | - (PROPERTY_TYPE)PROPERTY_NAME\ |
15 | { \ |
16 | return ( |
17 | } \ |
18 | \ |
19 | - ( void ) |
20 | { \ |
21 | objc_setAssociatedObject(self, |
22 | } \ |
相关文章推荐
- iOS使用Category添加@property变量
- iOS中为cagetory添加@property支持
- iOS中为cagetory添加@property支持
- iOS 添加中文支持
- iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册
- iOS 给category添加属性的小技巧
- iOS开发-在分类(Category)文件中添加属性
- 让Category支持添加属性与成员变量
- category 给IOS原生类添加属性
- 让Category支持添加属性与成员变量
- iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册
- 【原】iOS动态性(一):动态添加属性的方法——关联(e.g. 向Category添加成员变量)
- iOS运行时-使用Runtime向Category中添加属性以及运行时介绍
- iOS中OC给Category添加属性
- iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册
- 添加 core data 支持 ios 项目
- ios 自定义弹出输入框(支持自动添加分隔符,字数限制等功能)
- iOS (Category)runtime动态添加属性
- ios用category添加属性
- iOS 运行时runtime应用之二--在category中使用运行时API给类添加属性