由pushViewController說起可能出線的各種死法

做IOS開發者對導航條這個東西應該都不陌生,這咚咚在小小的屏幕上通過一個簡單的View的隊列管理來做到手機界面的有條理管理,但是開發過程程序員可能碰到各種死法,下面分享一二。

          例子:
MyViewController *sampleViewController = [[[MyViewController allocinitWithXXXautorelease];       

[self.navigationController pushViewController: sampleViewController animated:true];

[sampleViewController release];

 

上面代碼通常在一個UITabViewController中,某一行選中後,切換到詳細內容,上面代碼比較簡單,先從他的死法說起。

死法1:  objectc程序員菜鳥常放的毛病導致,上面代碼必死,爲神馬呢?

nav的push會導致引用計數的增加,界面會苟延殘喘一會,當popview的時候,最後一行release會把sampleViewController清0,接着就是autopool回收的的時候XXX了

     終結:爲了避免內存泄露,alloc必對應release或者autorelease,但是必須11對應,同理

用全局函數生成的類,你就不要release了,除非你retain(如果你要長期使用,retain是必須的),objectc的內存管理必須小心翼翼,否則。。。,我個人習慣,寧可掛掉也不能泄露,因爲掛掉容易發現問題,泄露了又有幾個程序員用工具分析解決呢。

 

開胃菜結束,開始正題:


MyViewController *sampleViewController = [[[MyViewController alloc]initWithXXXautorelease];       

[self.navigationController pushViewController: sampleViewController animated:true];

死法2:界面無反應,或者把自己界面刷了一下。

      分析可能出線的原因:

1:self.navigationController爲nil,空指針執行pushViewController直接跳過,接着sampleViewController會釋放掉,所以界面會無反應。

   self.navigationController爲神馬會空呢?navigationController是UIViewController父類繼承來的屬性,不是隨便都能用的,除非你當前viewController是被nav push進來的,或者用xib/代碼做成navigationcontroller的root了,cocoa的代碼應該是給賦值了。(題外話,我很多界面就是局部用了某個ViewController,這種情況該viewController的nav爲空,如果要正確使用,可以從app取,可以自己賦值,可以整體界面取。。。想咋取都行)

2、self.navigationController爲nil,界面掛了

   如果你sampleViewController用到了網絡異步請求,在initWithXXX的時候會去取數,那麼你10有89會掛掉。

   原因分析:大家網絡請求,經常如下:

 

TwitterClient   *twitterClient = [[TwitterClient allocinitWithTarget:self action:@selector(XXXReceive:obj:)];

 

[twitterClient getXXX:param];

恭喜你,這種情況不管是不是navigationController爲空,你程序極容易掛掉,原因就是因爲網絡請求我們都會用異步方式來拉取數據,當數據回來之後,會回調到本類的XXXReceive:obj方法,

但是如果界面退出了,數據才收到將如何?那就是不是空指針調用了,TwitterClient裏紀錄的需要回調的內存地址上神馬情況都有可能是,回調。。杯具了

 

解決辦法:twitterClient做成成員,在析構的時候該咋收拾twitterClient的就咋收拾一下吧

3、self.navigationController爲nil,界面掛了

     和上文一樣twitterClient成員了,dealloc也清理了現場,還是會掛

原因分析:異步的問題,twitterClient已經取到數據,但是sampleViewController已經被釋放了,but dealloc根本沒來得及進來。。。

    解決辦法,1:確保nav正確,2:儘量在界面viewDidLoad的時候網絡請求數據,在dispear的時候清理網絡。

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