Nad*_*ada 13 xcode swift xcode10
我最近下载了Xcode 10,并且在使用weak或unowned变量时发现了一个明显的错误.我设法创建了一个简单的示例来展示问题,以便人们可以重新创建它.
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)
要理解这一点,你必须知道这个概念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保留周期就不会发生.
这是 的目的weak。Swift 使用引用计数来管理内存。强指针将指向对象的引用计数加 1,弱指针不会增加引用计数。引用计数为 0 的对象将被释放。
您的实例SomeClass仅由弱指针指向,因此其引用计数为 0。因此它立即被释放。
弱对于避免保留循环很有用。例如,在转义闭包和委托设计模式中。
| 归档时间: |
|
| 查看次数: |
11485 次 |
| 最近记录: |