- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在研究向所有 UIView
实例添加属性(在本例中为整数)的方法,无论它们是否是子类。在类别中使用 objc_setAssociatedObject()
和 objc_getAssociatedObject()
是否是 Apple 认可的适当方式?
我听说有人担心这会构成“运行时黑客”,并可能导致难以追踪和调试的问题。还有其他人见过这种类型的问题吗?有没有更好的方法可以在不进行子类化的情况下向所有 UIView
实例添加整数属性?
更新:我不能只使用tag
,因为这需要在已经使用tag
的代码库中用于其他事物。相信我,如果我可以为此使用 tag
,我会的!
最佳答案
每当您想在类上伪造 ivar 时,关联对象就会派上用场。它们非常通用,因为您可以将任何对象关联到该类。
也就是说,您应该明智地使用它,并且仅将其用于子类化感觉很麻烦的小事情。
但是,如果您的唯一要求是向所有 UIView
实例添加一个整数,则 tag
是可行的方法。它已经存在并可供您使用,因此无需对 UIView
进行运行时修补。
如果您想要标记您的 UIView
而不是整数,例如通用对象,您可以定义如下类别。
@interface UIView (Tagging)
@property (nonatomic, strong) id customTag;
@end
#import <objc/runtime.h>
@implementation UIView (Tagging)
@dynamic customTag;
- (id)customTag {
return objc_getAssociatedObject(self, @selector(customTag));
}
- (void)setCustomTag:(id)aCustomTag {
objc_setAssociatedObject(self, @selector(customTag), aCustomTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
Erica Sadun 最近在这个 blog post 中提出了使用属性的选择器作为键的技巧。 .
关于ios - objc_setAssociatedObject 和 objc_getAssociatedObject 有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16019782/
我有一个很大的 tableView,我想在用户选择一个单元格后在 tableView 中添加 datePickers。 我正在使用 objc_setAssociatedObject() 和 objc_
我正在尝试将属性关联到数组扩展: private var AssociatedObjectHandle: String = "BlaBLabla" extension Array { var em
我有一个 NSURLConnection 类别,我使用关联对象扩展该类以保留对我的自定义类的引用,这样我可以稍后在委托(delegate)时在其他上下文中获取并将调用转发到实际目标。这样我就可以在运行
我正在尝试使用 objc_setAssociatedObject 传递对象 我正在尝试使用以下代码传递 Evento: Evento *evento = (Evento*)[secAtt object
这是我设置关联对象的方式: objc_setAssociatedObject(navigationItem, "rightButton", leftButtonView, OBJC_ASSOCIATI
我正在尝试将属性添加到 Timer 的扩展中使用关联对象,但函数 objc_setAssociatedObject总是返回 nil . Timer is a NSObject所以这应该有效。 代码:
我只想向 UIView 添加一个属性,如下所示, #import "UIView+Extension.h" #import @implementation UIView (Extension) -
我正在研究向所有 UIView 实例添加属性(在本例中为整数)的方法,无论它们是否是子类。在类别中使用 objc_setAssociatedObject() 和 objc_getAssociatedO
如果我在类别实现中使用 objc_setAssociatedObject/objc_getAssociatedObject 将模拟实例变量存储在 setter 方法中,我将如何访问 getter 方法
我正在尝试开发一个使用 objC++ 的 IOS 应用程序。我正在使用 this GUI framework用于设计我的 GUI。但是,问题是 XCode 似乎无法识别它自己的库 objc/runti
可以通过将这段代码放在 playground 中来观察行为: import Foundation import ObjectiveC class TestClass {} var obj = Test
我使用一个类别和一些存储在 UIView 中的变量。 但只存储id类型,所以我真的不想要任何id类型(int、float、double、char...等) 如何编写代码? #import #impo
我正在尝试在我的 objective-c 类别上使用关联对象,但收到此警告。 Implicit declaration of function 'objc_getAssociatedObject' i
如何测试 objc_getAssociatedObject 是否为 nil?下面说元素不是 nil 但关联的对象以前从未设置过也从未被访问过。 static char orderedElementKe
在 Objective-C 中,可以使用 _cmd 作为 objc_getAssociatedObject 的键,如 NSHipster article 中所述.在 Swift 中,只有 __FUNC
我们正在尝试使用 Xamarin.iOS 中的扩展为 UIAlertController 设置 AutomationId。但该应用程序在 var valuePtr = objc_getAssociat
我是一名优秀的程序员,十分优秀!