Xcode 10 - 实例将立即解除分配,因为属性"弱"

Nad*_*ada 13 xcode swift xcode10

我最近下载了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 {}
Run Code Online (Sandbox Code Playgroud)

正如错误所说,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?
}
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)

viv*_*Das 9

要理解这一点,你必须知道这个概念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
}
Run Code Online (Sandbox Code Playgroud)

所以,class B如果我们采取weak var classAObject保留周期就不会发生.


uki*_*kim 7

这是 的目的weak。Swift 使用引用计数来管理内存。强指针将指向对象的引用计数加 1,弱指针不会增加引用计数。引用计数为 0 的对象将被释放。

您的实例SomeClass仅由弱指针指向,因此其引用计数为 0。因此它立即被释放。

弱对于避免保留循环很有用。例如,在转义闭包和委托设计模式中。