文档章节

Objective-C动态添加property

王石头
 王石头
发布于 2016/07/27 21:13
字数 829
阅读 78
收藏 0

今天接到一个需求,要在一个指定View的subViews中查找几个特定的View进行指定的操作,但是对于开发者来说,它们都是最普通的View,没有什么特殊型来与其它对象区分开来,这个问题困扰了我好一会,最好想到的办法是在需要特殊处理的View生成时给它指定一个特殊的ID,这样在后期查找是就可以判断出subViews数组中那些对象是我需要处理的。

实现这个功能最方便的方法是新建一个UIView的Category,并动态创建businessID属性。代码如下:

#import <UIKit/UIKit.h>

@interface UIView (Additions)

@property (copy,nonatomic) NSString *sdBusinessID;

@end
#import "UIView+Additions.h"
#import <objc/runtime.h>

static const char *kBusinessID = "com.sd.businessID";

@implementation UIView (Additions)

- (void)setSdBusinessID:(NSString *)sdBusinessID
{
    objc_setAssociatedObject(self,
                             kBusinessID,
                             sdBusinessID,
                             OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)sdBusinessID
{
    return objc_getAssociatedObject(self, kBusinessID);
}

@end

如上就实现了动态设置property的功能,导入头文件即可使用。

在实现代码中我们用到了runtime中的两个方法,函数原型如下:

/** 
 * Sets an associated value for a given object using a given key and association policy.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * @param value The value to associate with the key key for object. Pass nil to clear an existing association.
 * @param policy The policy for the association. For possible values, see “Associative Object Behaviors.”
 * 
 * @see objc_setAssociatedObject
 * @see objc_removeAssociatedObjects
 */
OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

/** 
 * Returns the value associated with a given object for a given key.
 * 
 * @param object The source object for the association.
 * @param key The key for the association.
 * 
 * @return The value associated with the key \e key for \e object.
 * 
 * @see objc_setAssociatedObject
 */
OBJC_EXPORT id objc_getAssociatedObject(id object, const void *key)
    OBJC_AVAILABLE(10.6, 3.1, 9.0, 1.0);

我们首先来了解一下设置property的方法objc_setAssociatedObject。其中第一个参数object为要操作的对象;第二个参数key为存储/获取属性的key;第三个参数value为要保存的数据;第四个参数为访问策略,需要传入枚举值,具体如下:

typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0,           /**< Specifies a weak reference to the associated object. */
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied. 
                                            *   The association is not made atomically. */
    OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.
                                            *   The association is made atomically. */
    OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.
                                            *   The association is made atomically. */
};

通过枚举的名称我们就可以知道其功能,主要对应retain nonatomic、retain等,使用时可参照对应的注释选择自己需要的。

读取property值的方法比较简单,只要将操作对象与key传入参数即可。

另外还有一点需要注意,Category在扩展类的同时也存在与系统方法或第三方库中Category方法冲突的问题,在方法命名时可以加入特定的前缀或后缀来规避这一问题。

© 著作权归作者所有

共有 人打赏支持
王石头
粉丝 8
博文 24
码字总数 26001
作品 0
石景山
程序员
私信 提问
iOS开发小结(一):ObjCRuntimeGuide小记

Jason Lee @ 杭州 博客:http://blog.csdn.net/jasonblog 微博:http://weibo.com/jasonmblog 版本和平台 Runtime System对于Objective-C来说就好比是它的操作系统/运行平台,它使得Objecti...

迷途d书童
2012/03/05
650
0
Runtime of Objective-C

- (void)forwardInvocation:(NSInvocation *)anInvocation { if ([someOtherObject respondsToSelector:[anInvocation selector]]) [anInvocation invokeWithTarget:someOtherObject]; else ......

Im刘亚芳
2014/12/05
0
0
Objective-C Runtime:深入理解成员变量与属性

樱花盛开.jpg 概述 在上篇文章Objective-C Runtime:深入理解类与对象中,讲解了类与对象的相关内容。 在本文中,着重讲解一下类实现细节的先关内容,主要包括类中的成员变量、属性、方法以及...

Jack_lin
03/29
0
0
iOS学习之Objective-C 2.0 运行时系统编程

1 概述 Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。只要有可能,Objective-C总是使用动态的方式来解决问题。这意味着Objective-C语言不仅需要一个编译器,同时也需要一个运行...

Chars-D
2016/02/15
101
0
iOS的Target-Action模式传值的最佳方式

原文出处: talisk斯温的技术博客(@swaIn ) 在iOS中,所有的UIControl标准控件使用到最普遍最传统的执行方法的方式就是Target-Action,中文一般称作目标-动作,是比较常用的一种设计模式。...

刘星石
2016/04/14
214
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
15
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
11
0
my.ini

1

architect刘源源
今天
10
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
11
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部