由pushViewController提及可能出线的各类死法

作苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上经过一个简单的View的队列管理来作到手机界面的有条理管理,可是开发过程程序员可能碰到各类死法,下面分享一二。程序员

          例子:
MyViewController *sampleViewController = [[[MyViewController alloc] initWithXXX] autorelease];         

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

[sampleViewController release];app

 

上面代码一般在一个UITabViewController中,某一行选中后,切换到详细内容,上面代码比较简单,先从他的死法提及。异步

死法1:  objectc程序员菜鸟常放的毛病致使,上面代码必死,为神马呢?函数

nav的push会致使引用计数的增长,界面会苟延残喘一会,当popview的时候,最后一行release会把sampleViewController清0,接着就是autopool回收的的时候XXX了工具

     终结:为了不内存泄露,alloc必对应release或者autorelease,可是必须11对应,同理spa

用全局函数生成的类,你就不要release了,除非你retain(若是你要长期使用,retain是必须的),objectc的内存管理必须当心翼翼,不然。。。,我我的习惯,宁肯挂掉也不能泄露,由于挂掉容易发现问题,泄露了又有几个程序员用工具分析解决呢。.net

 

开胃菜结束,开始正题:指针

 

 

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

[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://my.oschina.net/zhangzhihao/blog/108096

相关文章
相关标签/搜索