- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
看来 objc_setAssociatedObject 会导致对象提前释放。
我按照提到的方法here设置关联。
import ObjectiveC
// Define a variable whose address we'll use as key.
// "let" doesn't work here.
var kSomeKey = "s"
…
func someFunc() {
var value = MyOtherClass()
objc_setAssociatedObject(target, &kSomeKey, value, UInt(OBJC_ASSOCIATION_RETAIN))
let assocValue : AnyObject! = objc_getAssociatedObject(target, &kSomeKey)
}
这导致对象在 objc_setAssociatedObject 调用期间被释放。正如您可以通过此堆栈跟踪看到的那样。
[MyOtherClass dealloc]
_objc_object::sidetable_release(bool)
_object_set_associative_reference
MyApp.MyClass.someFunc()
我最初认为它可能与 swift 类有关,所以我也尝试了标准的 Objective-C 类,并在 objc_setAssociatedObject 调用期间调用了 deinit 或 dealloc。
让我更加困惑的是 objc_getAssociatedObject 似乎返回了一个有效的对象,我可以毫无错误地访问它的变量。
这是一个 swift 错误还是我错误地使用了 objc_setAssociatedObject?
我正在使用 Xcode6 beta5 以防相关。
最佳答案
我猜您的代码甚至无法编译,因为您将“值”用作常量名称两次。
这在 beta 6 中作为 AppDelegate 工作正常:
import ObjectiveC
var kSomeKey = "this_is_a_key"
class MyOtherClass {
var foo = "bar"
deinit {
println("deinit")
}
}
@UIApplicationMain
class AppDelegateTest: UIResponder, UIApplicationDelegate {
func someFunc() {
var value = MyOtherClass()
objc_setAssociatedObject(self, &kSomeKey, value, UInt(OBJC_ASSOCIATION_RETAIN))
let value2: AnyObject! = objc_getAssociatedObject(self, &kSomeKey)
println("type of is \(_stdlib_getTypeName(value2))")
let value3 = value2 as MyOtherClass
println("other is " + value3.foo)
println("end of someFunc()")
}
func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool {
self.someFunc()
return true
}
}
我几乎没有改变任何东西,并且从未调用过 deinit 方法。
关于ios - 在 swift 中使用 objc_setAssociatedObject 时提前调用 dealloc/deinit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308192/
在类别 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() 来删除它们。 有没
我是一名优秀的程序员,十分优秀!