由pushViewController说起可能出线的各种死法

转载 2013年06月08日 22:14:47


     做苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的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的时候清理网络。

由pushViewController说起可能出线的各种死法

做IOS开发者对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的View的队列管理来做到手机界面的有条理管理,但是开发过程程序员可能碰到各种死法,下面分享一二。          ...
  • gghu1986
  • gghu1986
  • 2013年01月28日 20:13
  • 2167

由pushViewController说起可能出线的各种死法

做苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的View的队列管理来做到手机界面的有条理管理,但是开发过程程序员可能碰到各种死法,下面分享一二。          ...
  • cuanci
  • cuanci
  • 2014年09月08日 16:56
  • 202

单纯卖货思维对新媒体缺乏认知 电商常见十大死法

一、单纯卖货思维   点评:这是传统品牌的传统营销思维在电商运作上的继续,或者说还是以传统的营销思维来做电商。其实,传统品牌在传统渠道也是卖货的思维,说白了卖货的思维就是批发的思维。 ...
  • Peteraga
  • Peteraga
  • 2014年04月02日 14:44
  • 486

创业这10种死法,你死在哪一种了

转自: 网易科技-创业Club http://tech.163.com/15/1112/10/B87BJK2B00094P40.html 谈创业死法,实际是在谈活法。真正的死法可能有一万种,但真...
  • lanyd
  • lanyd
  • 2015年11月16日 14:47
  • 521

[转载]创业者的N种死法

现在什么最多?创业者最多,CEO最多,在创业大街上随便拉住人问,十个人里有九个是CEO。但是自己创业当老板固然有当老板的风光,但是当了老板才发现,老板也不容易。其中最糟的情况,大约是今天是这家公司的老...
  • sealeader
  • sealeader
  • 2015年11月25日 08:27
  • 689

以后需要注意的一些Java开发规范

这两天把《阿里巴巴java开发手册》看了一遍,整个手册页数并不多,里面的内容都挺好,下面这些是选的自己以前没有注意的或者感觉很有用的点。编程规范命名风格10.【强制】杜绝完全不规范的缩写,避免望文不知...
  • daocaoren92wq
  • daocaoren92wq
  • 2017年05月29日 22:50
  • 195

详解:腾讯帝国将会如何走向灭亡!!

腾讯从马化腾等几个人搞的小软件,到今天的QQ帝国,期间经历了太多的人和事,今天的腾讯被很多人称为中国互联网创业绕不过去的坎。 我们也知道,月有阴晴圆缺,百年老店不常有,特别是高科技行业,IB...
  • sinat_26550111
  • sinat_26550111
  • 2015年11月17日 16:09
  • 165

使用模态视图导致pushViewController失效的解决方法

使用模态视图导致pushViewController失效的解决方法 通常我们用pushViewController来将一个新的视图压入栈,由于栈的特性,我们可以不停的将新的视图压入栈中,也就实现了A...
  • abc649395594
  • abc649395594
  • 2015年02月25日 11:26
  • 1903

O2O的六种死法

1.只玩概念,忽略概念背后的目的。   玩概念,是有些人的通病。在和这种人聊天的过程中,你会发现,他满口的O2O,p2p,互联网+,工业4.0,大数据,等等,说的兴奋不已,听众听的腾云驾雾。往往这个时...
  • saidto
  • saidto
  • 2015年09月18日 17:21
  • 183

Android绘图技巧练习之~~~~画表练习

Canvas作为绘图的直接对象提供了几个非常有用的方法。下面先介绍一下,然后再来练习。 1.Canvas.save();  保存画布,大概功能就是将之前所有绘制的的图型保存起来。 2.Canvas...
  • u012247772
  • u012247772
  • 2016年07月22日 10:22
  • 181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由pushViewController说起可能出线的各种死法
举报原因:
原因补充:

(最多只允许输入30个字)