簡體   English   中英

在Swift中使用objc_setAssociatedObject時提前調用dealloc / deinit

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM