似乎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。
答案 0 :(得分:0)
我猜您的代码甚至不会编译,因为您使用“value”两次作为常量名称。
这可以作为测试版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方法。