2017-03-13 103 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'。 –

相關問題