[英]dealloc/deinit called early when using objc_setAssociatedObject in swift
看來objc_setAssociatedObject導致對象提前釋放。
我按照此處提到的方法設置關聯。
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。
我猜您的代碼甚至都不會編譯,因為您兩次使用“值”作為常量名稱。
作為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方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.