【问题标题】:Why this viewController property doesn't prevent the object from being deallocated?为什么这个 viewController 属性不会阻止对象被释放?
【发布时间】:2017-03-13 08:12:54
【问题描述】:

请考虑以下代码:

class Module {
    let viewController = ExampleViewControler()

    deinit {
        print("deinit")
    }
}

class ExampleViewControler: UIViewController {}



@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        window = UIWindow(frame: UIScreen.main.bounds)

        let mod = Module()
        let navController = UINavigationController(rootViewController: mod.viewController)
        window?.rootViewController = navController

        window?.makeKeyAndVisible()

        return true
    }

viewController 由 navController 保留。为什么在 Module 实例上调用 deinit?既然它的属性被保留了,它不应该也被保留吗?

无论如何,我想让对象保持活跃,因为它的视图控制器还活着。我怎样才能做到这一点?

谢谢!

【问题讨论】:

    标签: ios swift memory-management dealloc retain-cycle


    【解决方案1】:

    mod 变量不被任何人保留。它是函数的内部变量。一旦函数退出,mod 就会被释放。没有人保留它。

    【讨论】:

    • 是的,但 Module 不应该对 viewController 有强引用吗?
    • 为了澄清,一个对象将保留它的属性(除非它们是weak),但有一些其他对象也保留了该属性所引用的对象(在这种情况下,导航控制器)不会意味着对象本身将被保留。 Something 需要持有对mod 的引用以防止它被释放
    • @Davide 它有一个强引用 to viewController,但没有人有一个强引用 to mod
    • 好的,明白了。标记为已接受。谢谢你,也感谢 Paulw11 的澄清。
    猜你喜欢
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2010-10-21
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多