2014年12月26日 星期五

ViewController到底有沒有被Deinit?

在Swift當中大部分時間是不用理會記憶體分配的,理論swift自己會重新釋放沒有被使用的記憶體區塊
而釋放的依據則是根據該區塊是否有被強參考指向,有則不釋放,否則釋放
在這個大前提底下存在著一些陷阱導致ViewController本身在Dismiss or PopViewController的時候根本就沒有deinit
(可以在ViewController加入下列來做確認
 deinit{ println("\(self.classForCoder.description()) be deinit"); }





像我的寫法會在AppDelegate 寫共用的東西(例如Menu共用
在ViewController把 Menu所有權拿來之後
e.g.: self.menu  = (UIApplication.sharedApplication().delegate as AppDelegate).sideMenu;
爾後離開ViewController時 self.menu 依然存在著  (UIApplication.sharedApplication().delegate as AppDelegate).sideMenu
這意思是self.menu是個強參考,被 (UIApplication.sharedApplication().delegate as AppDelegate).sideMenu所指向
因此self.menu的所有者ViewController就無法被ARC主動回收! 因此的你的ViewController會一直存在記憶體當中有 >.0
要解決這個問題有兩種辦法:
1. 如官方所說,這種可能造成的情況用weak來宣告弱參考
e.g.: weak var self.menu  = (UIApplication.sharedApplication().delegate as AppDelegate).sideMenu;
這樣在離開頁面之後,ARC機制會自動忽略掉weak型別,這樣ViewController就會被deinit了
2.自己勤勞點,在離開頁面後把變數nil掉
e.g.: self.menu = nil;

上面這兩個辦法,第一個是最佳解 較為符合語法特性,第二個方法是....恩....練習用寫法
此陷阱發現是緣由於看到xCode提供的Memory use中使用量一直降不下來,爾後又研究一下語言特性
把deinit放進去測一下發現果真沒有被釋放掉
PS:
最後發現其實那Memory use是唬爛人的,那根本就是記憶體使用總量,增高是正常的(但他偶爾也會降,不明所以)
真的要看記憶體使用量應該是此工具才對:

沒有留言:

張貼留言