【发布时间】:2014-10-08 02:43:07
【问题描述】:
似乎 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 似乎返回了一个有效的对象,我可以毫无错误地访问它的变量。
这是一个快速的错误还是我错误地使用了 objc_setAssociatedObject?
我正在使用 Xcode6 beta5 以防万一。
【问题讨论】:
-
您确定没有为该键设置关联对象吗?看起来现有的
MyOtherClass实例正在被新实例替换。旧实例已被释放,因为没有其他对它的引用。 -
-
@Darren 感谢您的帮助,事实证明这毕竟是问题所在。我错误地假设“目标”每次都不同,而在某些情况下,相同的“目标”为其设置了不同的值,导致先前设置的对象被释放。如果您想写下您的评论作为答案,我愿意接受。
标签: ios objective-c memory-management swift