作蘋果開發或者果粉對導航條這個東西應該都不陌生,這咚咚在小小的屏幕上經過一個簡單的View的隊列管理來作到手機界面的有條理管理,可是開發過程程序員可能碰到各類死法,下面分享一二。html
[self.navigationController pushViewController: sampleViewController animated:true];程序員
[sampleViewController release];網絡
上面代碼一般在一個UITabViewController中,某一行選中後,切換到詳細內容,上面代碼比較簡單,先從他的死法提及。app
死法1: objectc程序員菜鳥常放的毛病致使,上面代碼必死,爲神馬呢?異步
nav的push會致使引用計數的增長,界面會苟延殘喘一會,當popview的時候,最後一行release會把sampleViewController清0,接着就是autopool回收的的時候XXX了函數
終結:爲了不內存泄露,alloc必對應release或者autorelease,可是必須11對應,同理工具
用全局函數生成的類,你就不要release了,除非你retain(若是你要長期使用,retain是必須的),objectc的內存管理必須當心翼翼,不然。。。,我我的習慣,寧肯掛掉也不能泄露,由於掛掉容易發現問題,泄露了又有幾個程序員用工具分析解決呢。指針
開胃菜結束,開始正題:htm
[self.navigationController pushViewController: sampleViewController animated:true];blog
死法2:界面無反應,或者把本身界面刷了一下。
分析可能出線的緣由:
1:self.navigationController爲nil,空指針執行pushViewController直接跳過,接着sampleViewController會釋放掉,因此界面會無反應。
self.navigationController爲神馬會空呢?navigationController是UIViewController父類繼承來的屬性,不是隨便都能用的,除非你當前viewController是被nav push進來的,或者用xib/代碼作成navigationcontroller的root了,cocoa的代碼應該是給賦值了。(題外話,我不少界面就是局部用了某個ViewController,這種狀況該viewController的nav爲空,若是要正確使用,能夠從app取,能夠本身賦值,能夠總體界面取。。。想咋取都行)
二、self.navigationController爲nil,界面掛了
若是你sampleViewController用到了網絡異步請求,在initWithXXX的時候會去取數,那麼你10有89會掛掉。
緣由分析:你們網絡請求,常常以下:
TwitterClient *twitterClient = [[TwitterClient alloc] initWithTarget:self action:@selector(XXXReceive:obj:)];
[twitterClient getXXX:param];
恭喜你,這種狀況不論是不是navigationController爲空,你程序極容易掛掉,緣由就是由於網絡請求咱們都會用異步方式來拉取數據,當數據回來以後,會回調到本類的XXXReceive:obj方法,
可是若是界面退出了,數據才收到將如何?那就是否是空指針調用了,TwitterClient裏紀錄的須要回調的內存地址上神馬狀況都有多是,回調。。杯具了
解決辦法:twitterClient作成成員,在析構的時候該咋收拾twitterClient的就咋收拾一下吧
三、self.navigationController爲nil,界面掛了
和上文同樣twitterClient成員了,dealloc也清理了現場,仍是會掛
緣由分析:異步的問題,twitterClient已經取到數據,可是sampleViewController已經被釋放了,but dealloc根本沒來得及進來。。。
解決辦法,1:確保nav正確,2:儘可能在界面viewDidLoad的時候網絡請求數據,在dispear的時候清理網絡。
轉:http://www.cnblogs.com/kikee/archive/2011/11/16/2250615.html