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保留周期就不会发生. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |