- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在文档中...
objc_setAssociatedObject
Sets an associated value for a given object using a given key and association policy.
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
Parameters object The source object for the association.
key The key for the association.
value The value to associate with the key key for object. Pass nil to clear an existing association.
policy The policy for the association. For possible values, see “Associative Object Behaviors.”
不清楚的是,当您调用 objc_setAssociatedObject()
删除关联时,是否有必要使用与最初设置属性相同的策略?还是 objc_setAssociatedObject()
只是使用适当的策略来“撤消”之前的设置?我假设它必须忽略该策略,否则如果您只是设置另一个值,则之前的值也需要使用相同的策略进行设置。不同之处在于,在某些情况下,当前存储的属性的引用计数会被调整,而在其他情况下则不会。
很明显,系统确实在内部跟踪它,否则通用的 objc_removeAssociatedObjects()
将永远无法工作,ARC 无论如何都需要知道这一点才能工作。
我个人需要知道的原因是以下代码片段:
typedef const void* associatedPropertyKeyToken;
和
-(NSMutableDictionary*) associatedInfo{
NSMutableDictionary *result = [self associatedPropertyForKey:NSAsssociatedInfo];
if (!result) {
[self retainAssociatedProperty:(result = [NSMutableDictionary dictionary])
forKey:NSAsssociatedInfo];
}
return result;
}
-(BOOL) associatedPropertyForKeyExists:(associatedPropertyKeyToken)aKey {
#if DEBUG_ASSOCIATED
BOOL result =
#else
return
#endif
objc_getAssociatedObject(self,aKey)!=nil;
#if DEBUG_ASSOCIATED
NSLog(@"getting associatedPropertyForKeyExists:%@ = %@",NSStringFromAssociatedPropertyKeyToken(aKey),
result ? @"YES" : @"NO");
return result;
#endif
}
-(void) assignAssociatedProperty:(id)prop forKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"assigning associatedPropertyForKey:%@ <= %@",NSStringFromAssociatedPropertyKeyToken(aKey),
prop);
#endif
objc_setAssociatedObject(self,aKey, prop, OBJC_ASSOCIATION_ASSIGN);
}
-(void) retainAssociatedProperty:(id)prop forKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"retaining associatedPropertyForKey:%@ <= %@",NSStringFromAssociatedPropertyKeyToken(aKey),
prop);
#endif
objc_setAssociatedObject(self, aKey, prop, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void) removeAssociatedPropertyForKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"removing associatedPropertyForKey:%@",NSStringFromAssociatedPropertyKeyToken(aKey));
#endif
objc_setAssociatedObject(self,aKey, NULL, OBJC_ASSOCIATION_ASSIGN);
}
最佳答案
objc_setAssociatedObject
的policy
参数指定运行时应该如何处理同一函数调用的value
参数,而不是它应该如何处理任何其他对象(例如同一 key
的先前或 future 值)。因此,当您关联 value
时给出的策略就是当您取消关联 value
时使用的策略。
您可以验证实现是否以这种方式运行,因为 Objective-C 运行时的源代码是开源的。您可以在 objc-references.mm
中找到处理关联引用的代码.感兴趣的函数是 _object_set_associative_reference
,它调用 ReleaseValue
,它调用 releaseValue
。
关于objective-c - objc_setAssociatedObject with nil 要删除 - 是否检查了策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920591/
在类别 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() 来删除它们。 有没
我是一名优秀的程序员,十分优秀!