gpt4 book ai didi

swift - Xcode 10 - 实例将被立即释放,因为属性是 'weak'

转载 作者:IT王子 更新时间:2023-10-29 05:36:09 25 4
gpt4 key购买 nike

我最近下载了 Xcode 10,我注意到在使用 weakunowned 变量时有一个明显的错误。我设法创建了一个简单的示例来展示问题,以便人们可以重新创建它。

class MainClass {
weak var weakClass: SomeClass!

init() {

// WARNING: Instance will be immediately deallocated because property 'weakClass' is 'weak'

self.weakClass = SomeClass()
}
}

class SomeClass {}

如错误所述,weakClass 会在 MainClass 初始化后立即解除分配,并且始终为 nil。

我已经用 Xcode 9.3 打开了同一个 Playground ,我可以确认代码工作正常,没有错误或警告

这是 Xcode 10 中的错误还是我没有得到什么。如果是,是否有任何解决方法?

编辑:原始示例

class LoginCoordinator {

var viewModel: LoginViewModel?
var viewController: LoginViewController?

init() {
viewModel = LoginViewModel()
viewModel?.coordinator = self
viewController = LoginViewController(viewModel: viewModel!)
}
}


class LoginViewModel: ViewModelDelegate {
weak var coordinator: LoginCoordinator?
}

coordinatorLoginViewModel

中始终为 nil

AppDelegate.swift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func setupView() {
let coordinator = LoginCoordinator()
let navigationController = UINavigationController(rootViewController: coordinator.create)

navigationController.isNavigationBarHidden = true
navigationController.navigationBar.isTranslucent = false

window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
window?.layer.cornerRadius = 6
window?.layer.masksToBounds = true
}

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
setupView()
return true
}

最佳答案

要理解这一点,您必须了解 ARC 的概念。 ARC 的概念是自动引用计数意味着 ARC 会在内存中保留一些东西,只要分配的内存被某个变量强引用。如果它(ARC)发现一些分配的内存没有任何强引用,它将释放它。因此,警告 weakClass 立即 deallocates 一旦 MainClass 被初始化并且始终为零。因为它没有任何强引用。有疑问请评论。

下面是创建保留循环的示例:

class A {
var classBObject: B?

init() {
classBObject = B()
classBObject.classAObject = self // Creates a retain cycle
}
}

class B {
var classAObject: A? // Strong(by default all are strong) variable create retain cycle
}

因此,在 class B 中,如果我们采用 weak var classAObject 保留循环将不会发生。

关于swift - Xcode 10 - 实例将被立即释放,因为属性是 'weak',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51779484/

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