swift – Xcode 10 – 实例将立即解除分配,因为属性“弱”

swift – Xcode 10 – 实例将立即解除分配,因为属性“弱”,第1张

概述我最近下载了 Xcode 10,并且在使用弱或无主变量时发现了一个明显的错误.我设法创建了一个简单的示例来展示问题,以便人们可以重新创建它. class MainClass { weak var weakClass: SomeClass! init() { // WARNING: Instance will be immediately deallocated 我最近下载了 Xcode 10,并且在使用弱或无主变量时发现了一个明显的错误.我设法创建了一个简单的示例来展示问题,以便人们可以重新创建它.

class MainClass {    weak var weakClass: SomeClass!    init() {        // WARNING: Instance will be immediately deallocated because property 'weakClass' is 'weak'        self.weakClass = SomeClass()    }}class SomeClass {}

正如错误所说,一旦MainClass被初始化,weakClass立即释放,并且总是为零.

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

这是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?}

在Loginviewmodel中,coordinator始终为nil

AppDelegate.swift

@UIApplicationMainclass 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立即释放,并且总是为零.因为它没有任何强大的参考.请评论任何疑问.

以下是保留周期创建的一个示例:

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}

所以,在B类中如果我们采用弱var classAObject保留周期就不会发生.

总结

以上是内存溢出为你收集整理的swift – Xcode 10 – 实例将立即解除分配,因为属性“弱”全部内容,希望文章能够帮你解决swift – Xcode 10 – 实例将立即解除分配,因为属性“弱”所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1028955.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存