加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 18:05:10 所属栏目:百科 来源:网络整理
导读:我最近下载了 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

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

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

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保留周期就不会发生.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读