gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:43:10 25 4
gpt4 key购买 nike

看来 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 似乎返回了一个有效的对象,我可以毫无错误地访问它的变量。

这是一个 swift 错误还是我错误地使用了 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 方法。

关于ios - 在 swift 中使用 objc_setAssociatedObject 时提前调用 dealloc/deinit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308192/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com