`
zhy584520
  • 浏览: 183547 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

objc_getAssociatedObject, objc_setAssociatedObject

    博客分类:
  • IOS
 
阅读更多

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociatedObject以及objc_setAssociatedObject,我们来看下这两个方法:

OBJC_EXPORT void objc_setAssociatedObject(id objectconst void *key, id value, objc_AssociationPolicy policy)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);
OBJC_EXPORT id objc_getAssociatedObject(id objectconst void *key)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

另外还有一个方法:

OBJC_EXPORT void objc_removeAssociatedObjects(id object)
__OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_3_1);

objc_getAssociatedObject、objc_setAssociatedObject、objc_removeAssociatedObjects都是Obj-c中的外联方法,object 参数作为待扩展的对象实例,key作为该对象实例的属性的键,而value就是对象实例的属性的值,policy作为关联的策略,它的枚举包括:

复制代码
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
复制代码

具体我就多说了,可以看得懂的。

另外,objc_removeAssociatedObjects可以删除指定对象实例的所有扩展属性。

 

可以用它来绑定数据到控件上,并可以自由读取。

分享到:
评论

相关推荐

    iOS-OC-Runtime使用小谈(objc_setAssociatedObject)

    在这个例子中,我们为`UIView`添加了一个`borderColor`属性,利用`objc_setAssociatedObject`和`objc_getAssociatedObject`实现了属性的存取。 需要注意的是,虽然关联对象提供了很大的灵活性,但过度使用可能会...

    实战 objc_setAssociatedObject

    return objc_getAssociatedObject(self, @selector(tagValue)); } - (void)setTagValue:(NSNumber *)tagValue { objc_setAssociatedObject(self, @selector(tagValue), tagValue, OBJC_ASSOCIATION_RETAIN_...

    通过 objc_setAssociatedObject (关联) 的形式实现为Category (类别) 添加属性

    这里可以使用`objc_getAssociatedObject`和`objc_setAssociatedObject`来存取关联对象。 ```objc @implementation NSObject (MyCategory) - (NSString *)myProperty { return objc_getAssociatedObject(self, @...

    [Objective-C]关联(objc_setAssociatedObject、objc_getAssociatedObjec

    这就是 `objc_setAssociatedObject`、`objc_getAssociatedObject` 和 `objc_removeAssociatedObjects` 这三个函数的作用,它们提供了关联对象的能力。 `objc_setAssociatedObject` 函数用于设置关联对象。它的基本...

    iOS关联objc_setAssociatedObject

    iOS-关联(objc_setAssociatedObject、objc_getAssociatedObject、objc_removeAssociatedObjects) 详解请参考:http://blog.csdn.net/u014220518/article/details/71750875

    RuntimeTest添加属性

    在这个项目中,我们将深入探讨`objc_setAssociatedObject`和`objc_getAssociatedObject`这两个API的用法,以及它们在实际开发中的应用。 1. **Runtime简介** Objective-C的Runtime系统是它区别于其他静态类型语言...

    Objective-C Associated Objects 的实现原理.pdf

    这项技术在使用时涉及三个关键的函数:objc_setAssociatedObject、objc_getAssociatedObject和objc_removeAssociatedObjects。这些函数能够让我们通过runtime进行底层操作,将一个对象和另一个对象进行关联。 objc_...

    Runtime使ViewController具有name属性

    这里使用了`objc_setAssociatedObject`和`objc_getAssociatedObject`这两个Runtime函数,将`name`属性与ViewController对象关联起来,实现了属性的存取。 2. **Associated Objects**: 上述Category中,我们使用了...

    为分类动态添加属性.zip

    使用`objc_setAssociatedObject`和`objc_getAssociatedObject`这两个API,我们可以将数据关联到特定的对象上。例如: ```objc objc_setAssociatedObject(self, @selector(hiddenFlag), @(YES), OBJC_ASSOCIATION_...

    ios 对象私有属性的访问和修改

    要访问私有属性,我们可以使用`objc_getAssociatedObject`和`objc_setAssociatedObject`函数,它们用于关联对象。例如: ```objc objc_setAssociatedObject(myObject, @"privatePropertyKey", @"New Value", OBJC_...

    Type-Safe Associated Objects in Swift.zip

    在Swift的标准库中,我们可以使用`objc_setAssociatedObject`和`objc_getAssociatedObject`来创建关联对象,但这两种方法都是基于Objective-C的,并且在Swift中使用时缺乏类型安全。`swift-tsao`库解决了这个问题,...

    分类中添加属性_实例代码

    然后,使用`objc_setAssociatedObject`和`objc_getAssociatedObject`方法来设置和获取关联对象。 ```objc // 添加属性 static char associatedKey; - (void)setCustomProperty:(id)value { objc_...

    ios runtime

    - 可以使用关联引用将额外的信息与对象实例关联起来,使用objc_setAssociatedObject来设置关联对象,使用objc_getAssociatedObject来获取。 7. 消息传递(Sending Messages) - Objective-C的消息传递机制允许在...

    Swift4: 可拖动头像,增加物理属性

    objc_setAssociatedObject(imageView, &draggingCategoryName as Void*, draggingCategory, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) object_setClass(imageView, draggingCategory) } } ...

    用objc/runtime给类别扩展属性代码

    objc_setAssociatedObject(self, &MyPropertyKey, myProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSString *)myProperty { return objc_getAssociatedObject(self, &MyPropertyKey); } ``` 3. 动态属性...

    button防连续点击(runtime)

    2. 添加关联对象:在分类中,我们使用`objc_setAssociatedObject`和`objc_getAssociatedObject`来动态地添加一个关联属性`clickInterval`,用于存储按钮的点击间隔时间。 3. 重写`sendAction:to:forEvent:`方法:这...

    iOS UIButton扩大按钮响应区域的解决方法

    objc_setAssociatedObject(self, &bottomNameKey, [NSNumber numberWithFloat:size], OBJC_ASSOCIATION_COPY_NONATOMIC); objc_setAssociatedObject(self, &leftNameKey, [NSNumber numberWithFloat:size], OBJC_...

    OC runtime学习笔记之关联对象

    objc_setAssociatedObject(self, TitleKey, title, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } - (NSString *)title { return objc_getAssociatedObject(self, TitleKey); } ``` 在这个例子中,我们使用`TitleKey`...

    OAHUD:一个简单的iOS HUD App 练习!

    Welcome to OA's HUD!一个简单的iOS HUD App 练习!声明本作品授权采用姓名标示-... *在[DaiInboxHUD]( )专案中,学习到objc/runtime.h、objc_setAssociatedObject、objc_getAssociatedObject、animateWithDuration的使

    从控制器中分离出View

    objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy) 参数: object 关联者 key key与value是一一对应的关系,必须确保key全局唯一。...

Global site tag (gtag.js) - Google Analytics