2017-03-13 63 views
0

请考虑下面的代码:为什么这个viewController属性不会阻止对象被释放?

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保留。为什么在模块实例上调用deinit?不应该保留它,因为它的财产保留了吗?

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

谢谢!

回答

2

mod变量不被任何人保留。这是该函数的一个内部变量。一旦函数退出,mod正在被释放。没有人保留它。

+0

是的,但不应该模块有一个强大的参考viewController? – Davide

+0

为了澄清,一个对象将保留其属性(除非它们是“弱”),但有一些其他对象也保留该属性引用的对象(在这种情况下,导航控制器)并不意味着该对象本身将是保留。 *某些*需要保留对'mod'的引用以防止它被释放 – Paulw11

+0

@Davide它具有很强的引用_to_ viewController,但没有人有强大的引用_to_'mod'。 –

相关问题