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

由pushViewController说起可能出线的各种死法,第1张

概述做苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的View的队列管理来做到手机界面的有条理管理,但是开发过程程序员可能碰到各种死法,下面分享一二。           例子: MyViewController  *sampleViewController = [[[ MyViewController  alloc ]  initWithXXX ]  autorele 做苹果开发或者果粉对导航条这个东西应该都不陌生,这咚咚在小小的屏幕上通过一个简单的VIEw的队列管理来做到手机界面的有条理管理,但是开发过程程序员可能碰到各种死法,下面分享一二。@H_301_8@@H_301_8@@H_301_8@           例子:@H_301_8@ MyVIEwController@H_301_8@  *sampleVIEwController = [[[@H_301_8@@H_301_8@ MyVIEwController@H_301_8@@H_301_8@ @H_301_8@@H_301_8@ alloc@H_301_8@@H_301_8@ ] @H_301_8@@H_301_8@ initWithXXX@H_301_8@@H_301_8@ ] @H_301_8@@H_301_8@ autorelease@H_301_8@@H_301_8@ ];@H_301_8@@H_301_8@        @H_301_8@@H_301_8@

@H_301_8@[self.@H_301_8@@H_301_8@navigationController@H_301_8@@H_301_8@ @H_301_8@@H_301_8@pushVIEwController@H_301_8@: sampleVIEwController @H_301_8@@H_301_8@animated@H_301_8@:@H_301_8@@H_301_8@true@H_301_8@@H_301_8@];@H_301_8@@H_301_8@

[sampleVIEwController release];@H_301_8@@H_301_8@@H_301_8@@H_301_8@


@H_301_8@@H_301_8@@H_301_8@@H_301_8@

上面代码通常在一个UITabVIEwController中,某一行选中后,切换到详细内容,上面代码比较简单,先从他的死法说起。@H_301_8@@H_301_8@

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

nav的push会导致引用计数的增加,界面会苟延残喘一会,当popvIEw的时候,最后一行release会把sampleVIEwController清0,接着就是autopool回收的的时候XXX了@H_301_8@@H_301_8@

     终结:为了避免内存泄露,alloc必对应release或者autorelease,但是必须11对应,同理@H_301_8@@H_301_8@

用全局函数生成的类,你就不要release了,除非你retain(如果你要长期使用,retain是必须的),objectc的内存管理必须小心翼翼,否则。。。,我个人习惯,宁可挂掉也不能泄露,因为挂掉容易发现问题,泄露了又有几个程序员用工具分析解决呢。@H_301_8@@H_301_8@


@H_301_8@@H_301_8@

开胃菜结束,开始正题:@H_301_8@@H_301_8@

@H_301_8@@H_301_8@

@H_301_8@

 *sampleVIEwController = [[[@H_301_8@@H_301_8@ alloc@H_301_8@@H_301_8@ ]@H_301_8@@H_301_8@ initWithXXX@H_301_8@@H_301_8@ ] @H_301_8@@H_301_8@ autorelease@H_301_8@@H_301_8@ ];@H_301_8@@H_301_8@        @H_301_8@@H_301_8@

@H_301_8@[self.@H_301_8@@H_301_8@navigationController@H_301_8@@H_301_8@ @H_301_8@@H_301_8@pushVIEwController@H_301_8@: sampleVIEwController @H_301_8@@H_301_8@animated@H_301_8@:@H_301_8@@H_301_8@true@H_301_8@@H_301_8@];@H_301_8@@H_301_8@

死法2:界面无反应,或者把自己界面刷了一下。@H_301_8@@H_301_8@

      分析可能出线的原因:@H_301_8@@H_301_8@

1:@H_301_8@@H_301_8@self.@H_301_8@@H_301_8@navigationController为nil,空指针执行@H_301_8@@H_301_8@pushVIEwController直接跳过,接着@H_301_8@sampleVIEwController会释放掉,所以界面会无反应。@H_301_8@@H_301_8@

   @H_301_8@@H_301_8@navigationController@H_301_8@@H_301_8@为神马会空呢?@H_301_8@@H_301_8@@H_301_8@navigationController是UIVIEwController父类继承来的属性,不是随便都能用的,除非你当前vIEwController是被nav push进来的,或者用xib/代码做成navigationcontroller的root了,cocoa的代码应该是给赋值了。(题外话,我很多界面就是局部用了某个VIEwController,这种情况该vIEwController的nav为空,如果要正确使用,可以从app取,可以自己赋值,可以整体界面取。。。想咋取都行)@H_301_8@@H_301_8@@H_301_8@

2、@H_301_8@@H_301_8@@H_301_8@self.@H_301_8@@H_301_8@navigationController为nil,界面挂了@H_301_8@@H_301_8@@H_301_8@

   如果你@H_301_8@@H_301_8@@H_301_8@sampleVIEwController用到了网络异步请求,在initWithXXX的时候会去取数,那么你10有89会挂掉。@H_301_8@@H_301_8@

   原因分析:大家网络请求,经常如下:@H_301_8@@H_301_8@

@H_301_8@

TwitterClIEnt   *twitterClIEnt@H_301_8@@H_301_8@ = [[@H_301_8@TwitterClIEnt@H_301_8@@H_301_8@ @H_301_8@alloc@H_301_8@@H_301_8@] @H_301_8@initWithTarget@H_301_8@@H_301_8@:@H_301_8@self@H_301_8@@H_301_8@@H_301_8@action@H_301_8@@H_301_8@:@H_301_8@@selector@H_301_8@@H_301_8@(XXXReceive:obj:)];@H_301_8@

 

[@H_301_8@@H_301_8@twitterClIEnt@H_301_8@ @H_301_8@@H_301_8@getXXX@H_301_8@@H_301_8@:param];@H_301_8@@H_301_8@

恭喜你,这种情况不管是不是@H_301_8@@H_301_8@navigationController为空,你程序极容易挂掉,原因就是因为网络请求我们都会用异步方式来拉取数据,当数据回来之后,会回调到本类的@H_301_8@@H_301_8@XXXReceive:obj方法,@H_301_8@@H_301_8@

但是如果界面退出了,数据才收到将如何?那就是不是空指针调用了,@H_301_8@@H_301_8@TwitterClIEnt里纪录的需要回调的内存地址上神马情况都有可能是,回调。。杯具了@H_301_8@@H_301_8@@H_301_8@


@H_301_8@@H_301_8@@H_301_8@

解决办法:@H_301_8@@H_301_8@twitterClIEnt做成成员,在析构的时候该咋收拾@H_301_8@@H_301_8@@H_301_8@twitterClIEnt的就咋收拾一下吧@H_301_8@@H_301_8@@H_301_8@

3、@H_301_8@@H_301_8@@H_301_8@navigationController为nil,界面挂了@H_301_8@@H_301_8@@H_301_8@@H_301_8@@H_301_8@@H_301_8@

     和上文一样@H_301_8@@H_301_8@@H_301_8@@H_301_8@@H_301_8@@H_301_8@twitterClIEnt成员了,@H_301_8@@H_301_8@dealloc也清理了现场,还是会挂@H_301_8@@H_301_8@

原因分析:异步的问题,@H_301_8@@H_301_8@twitterClIEnt已经取到数据,但是@H_301_8@@H_301_8@sampleVIEwController已经被释放了,but dealloc根本没来得及进来。。。@H_301_8@@H_301_8@

    解决办法,1:确保nav正确,2:尽量在界面@H_301_8@@H_301_8@vIEwDIDLoad的时候网络请求数据,在dispear的时候清理网络。@H_301_8@@H_301_8@

总结

以上是内存溢出为你收集整理的由pushViewController说起可能出线的各种死法全部内容,希望文章能够帮你解决由pushViewController说起可能出线的各种死法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1054514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存