- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在我接手的一个项目中,原作者选择使用 objc_setAssociatedObject()
,我不是 100% 清楚它的作用或他们决定使用它的原因。
我决定查一下,不幸的是,文档并没有很好地描述它的用途。
objc_setAssociatedObject
使用给定键和关联策略为给定对象设置关联值。void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy 策略)
参数对象
关联的源对象。键
关联的 key 。值
与对象的键键关联的值。传递 nil 以清除现有关联。政策
协会的政策。有关可能的值,请参阅“关联对象行为”。
那么这个函数到底是做什么的,应该在什么情况下使用呢?
阅读答案后编辑
那么下面的代码有什么意义呢?
Device *device = [self.list objectAtIndex:[indexPath row]];
DeviceViewController *next = [[DeviceViewController alloc] initWithController:self.controller
device:device
item:self.rootVC.selectedItem];
objc_setAssociatedObject(device, &kDeviceControllerKey, next, OBJC_ASSOCIATION_RETAIN);
如果设备已经是实例变量,那么将设备与 View Controller 关联起来有什么意义?
最佳答案
objc_setAssociatedObject
为每个 Objective-C 对象添加一个键值存储。它允许您存储对象的其他状态,而不是反射(reflect)在其实例变量中。
当您想在主实现之外存储属于某个对象的东西时,这真的很方便。主要用例之一是您无法添加实例变量的类别。在这里,您使用 objc_setAssociatedObject
将附加变量附加到 self
对象。
如果使用正确的关联策略,您的对象将在主对象被释放时被释放。
关于iphone - 什么是 objc_setAssociatedObject() 以及在什么情况下应该使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909412/
在类别 UIButton .h 文件中: @interface UIButton (zz) @property (nonatomic,strong) NSString *param1; @proper
我一直这样使用 objc_setAssociatedObject(): objc_setAssociatedObject(myObject, @"myKey1", obj2, OBJC_ASSOCIA
当我使用 objc_setAssociatedObject 时,我知道是使用 retain 还是 assign,但我不知道如何在 OBJC_ASSOCIATION_RETAIN 和 OBJC_ASSO
Xcode 6.4 swift 1.2 我该怎么做? 谢谢大家 看到这个错误 最佳答案 试试这个: objc_setAssociatedObject(self, &loadOperationKey,
对类对象使用 objc_setAssociatedObject 是否正确? 我们经常用这样的静态变量来模拟类变量: Objective C Static Class Level variables但是
我正在尝试制作一个用于 objc_setAssociatedObject 的 key ,如这个问题所示: How do I use objc_setAssociatedObject/objc_getA
这个问题在这里已经有了答案: How is Associative Reference implemented? (2 个答案) 关闭 9 年前。 正如我们所知,我们可以使用类别和运行时方法在 Ob
在我接手的一个项目中,原作者选择使用 objc_setAssociatedObject(),我不是 100% 清楚它的作用或他们决定使用它的原因。 我决定查一下,不幸的是,文档并没有很好地描述它的用途
我只想向 UIView 添加一个属性,如下所示, #import "UIView+Extension.h" #import @implementation UIView (Extension) -
我正在研究向所有 UIView 实例添加属性(在本例中为整数)的方法,无论它们是否是子类。在类别中使用 objc_setAssociatedObject() 和 objc_getAssociatedO
在 3.1 SDK 中,Apple 添加了对关联对象的支持。 但是,模拟器不会编译包含对 objc_setAssociatedObject、objc_getAssociatedObject 等的引用的
如果我使用一个类别,该类别使用 objc_setAssociatedObject 向对象添加伪属性,我如何确保它们被正确释放?我是否必须在 dealloc 中手动释放它们? 最佳答案 您分配的行为决定
我知道 OBJC_ASSOCIATION_ASSIGN 存在,但如果目标对象被释放,它会将引用清零吗?或者它是否像过去那样需要将引用置为零,否则我们以后可能会面临访问错误的风险? 最佳答案 正如 ul
如果我在类别实现中使用 objc_setAssociatedObject/objc_getAssociatedObject 将模拟实例变量存储在 setter 方法中,我将如何访问 getter 方法
我想设置n Swift 中一个对象的关联对象数量 我的理解是UnsafeRawPointer的通常模式引用是这样的... static var reference = "someRef" public
import UIKit import ObjectiveC var SubRowObjectKey: String = "subRow" extension IndexPath { var
我正在尝试通过扩展向 UIView 添加点击手势支持。这使用 Objective-C 非常简单,但是当我尝试在运行时属性上设置 void 返回 block 时出现以下错误。 error: type '
在文档中... objc_setAssociatedObject Sets an associated value for a given object using a given key and a
我正在尝试使用关联对象 API 将“属性”添加到类别。 objc_setAssociatedObject(self, &kIsAnimatingAssocObjKey, animating, OBJC
我计划使用 objc_setAssociatedObject() 将 iVars 添加到类别中。但是,我不确定何时调用 objc_removeAssociatedObjects() 来删除它们。 有没
我是一名优秀的程序员,十分优秀!