做蘋果開發或者果粉對導航條這個東西應該都不陌生,這咚咚在小小的屏幕上通過一個簡單的View的隊列管理來做到手機界面的有條理管理,但是開發過程程序員可能碰到各種死法,下面分享一二。 例子: MyViewController *sampleViewController = [[[MyViewController alloc] initWithXXX] autorelease]; [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]initWithXXX] autorelease]; [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 alloc] initWithTarget: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的時候清理網絡。 待續。。。。 |
|