首页 > 解决方案 > Xcode 10 - 实例将立即被释放,因为属性是“弱”

问题描述

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

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被初始化并且始终为零。

我用 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?
}

coordinator总是为零LoginViewModel

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
    }

标签: swiftxcodexcode10

解决方案


要理解这一点,您必须了解 的概念ARCARC概念是自动引用计数意味着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保留循环就不会发生。


推荐阅读