swift - Xcode 10 - 实例将立即被释放,因为属性是“弱”
问题描述
我最近下载了 Xcode 10,在使用weak
orunowned
变量时发现了一个明显的错误。我设法创建了一个简单的示例来展示问题,以便人们可以重新创建它。
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
}
解决方案
要理解这一点,您必须了解 的概念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
}
所以,class B
如果我们采取weak var classAObject
保留循环就不会发生。
推荐阅读
- c# - 如何测试具有许多可能结果的系统测试?
- python - 有人可以向我解释这个 Python 代码吗?
- amazon-web-services - AWS Cloudfront 行为未路由到正确路径
- java - 如何使用原始文本文件发送 POST 请求并在 Spring Boot 中接收
- javascript - 无法从 nodejs 模块获取结果
- php - 使用碳 laravel 获取上个月和上年
- javascript - 将数据从 Excel 传输到 PDF
- javascript - 无法在 ReactJS 中使用 firebase auth 重新发送 OTP
- reactjs - 未捕获的类型错误:repos.map 不是函数
- ms-word - 在 Word 在线加载项中,是否可以在特定位置而不是居中打开对话框