dealloc / deinit在swift中使用objc_setAssociatedObject时提前调用

时间:2014-08-14 12:34:10

标签: ios objective-c memory-management swift

似乎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。

1 个答案:

答案 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方法。