文档章节

Objective-C动态添加property

王石头
 王石头
发布于 2016/07/27 21:13
字数 829
阅读 77
收藏 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
622
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
3
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
1
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
3
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部