爲何ViewController釋放後不走dealloc

在一個項目中,如果ViewController使用完成之後,發現這個東東並沒有釋放掉,dealloc方法不走,看着那個內存蹭蹭的網上增,就跟自己的火氣一樣。相信大家都知道如何去釋放一個不用的ViewController,但是還是有些其他因素限制了內存釋放。


首先,如果你創建了一個VController,使用它卻沒釋放它,那這個VC肯定存在,那dealloc指定不調用,那麼你創建的類就會內存泄露

    textViewController * text = [[textViewController alloc] init];

    [self.navigationController pushViewController:text animated:YES];

    //[text release];


然後,如果你的VC中有NSTimer,那麼就要注意了,因爲當你

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];

時,這個 target:self 就增加了VC的RetarnCountr如果你不將這個timer invalidate,就別想調用dealloc。


再然後,一個比較隱蔽的因素,你反過頭去找找看,跟這個類有關的代理,嗯,對是代理,有沒有強引用的屬性啊?對,比如一個代理的delegate應該是 assign 的現在是retain,(╯‵□′)╯︵┻━┻,就是這個,它會影響你不讓你調用dealloc,不信,就試試吧。


最後,如果以上都沒有問題的話,那麼,真問題就來了。我就遇到了這種情況,在使用ASI進行網絡請求的時候,因爲需求原因,我使用屬性將名爲 ASIFormDataRequest NSOperation 標記住了,就將上面的問題找了又找,就是不行,最後是將那個標記的屬性置爲 nil 才解決了這個不調用 dealloc 的這個蛋疼問題。所以,如果你遇到了比較隱蔽的原因,那就去找找你自己控制不了的因素,就像這個第三方。如果你不瞭解它的運行機制,那就一定要注意這個庫對你程序的影響。嗯,善用XXX.delegate = self;


PS:dealloc中的釋放也是有順序的,就好比創建時,先父類,再子類,釋放的時候反過來,不然有機率會crash,至於原因。 ———————— 看了一個帖子,上面說:子類是父類的繼承,比較NB,以至於要殺死他們的時候應該先幹掉比較牛B的子類。    看完後我就記住了。很有意思~


發佈了17 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章