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

news/2024/7/20 16:02:40 标签: 内存管理

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

 

本文转载至   http://my.oschina.net/zhangzhihao/blog/108096

转载于:https://www.cnblogs.com/Camier-myNiuer/p/3342206.html


http://www.niftyadmin.cn/n/814009.html

相关文章

Java常用工具类之集合List、Set、Map

Java常用工具类之集合 一、List 在Collection中,List集合是有序的,Developer可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素。 在List集合中,我们常用到ArrayList和LinkedList这两个类。…

网站第三方社会化插件推荐

从评论系统到分享按钮,从智能推荐插件到社会化登陆,社会化插件已经入侵了网站的方方面面,我就推荐写适合个人网站使用的第三方社会化插件。 搜索引擎认为最有价值的(按先后顺序): 1:内容 2&…

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式。 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接)。此网站不仅可以检测Json代码…

迈出第一步,就是成功的开始

我是一名国贸专业的毕业生,然而我从事的不是跟本专业相关的工作。在网上寻找工作的时候无意中看到了视觉设计培训,我知道设计行业发展前景很好,再加上我本身也挺喜欢艺术设计这块的,于是我就想参加视觉设计的培训,既可…

grpc 的协议分析

grpc 和通常的基于TCP的实现不同,是直接基于HTTP2 协议的。HTTP2 使得grpc 能够更好的适用于移动客户端和服务端通信的使用场景,并且连接多路复用也保证了RPC 的效率。 grpc 的协议设计上很好的使用了HTTP2 现有的语义,请求和响应的数据使用H…

谈谈国内几款个性化推荐系统插件

首先了解,什么是个性化推荐?个性化阅读? 个性化推荐是根据用户的兴趣特点和需求行为,向用户推荐用户感兴趣的信息和商品。随着电子商务规模的不断扩大,商品个数和种类快速增长,顾客需要花费大量的时间…

Java10开发环境配置和eclipse的安装

Java10开发环境配置和eclipse的安装 一、Java环境的设置 0x1 安装Java Java下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 安装下载好的jdk安装包,双击打开一直下一步。 一直到安装完成 0x2 Java环境变量…

IOS管理文件和目录

1、常见的NSFileManager文件方法 -(NSData *)contentsAtPath:path  //从一个文件读取数据 -(BOOL)createFileAtPath: path contents:(NSData *)data attributes:attr  //向一个文件写入数据 -(BOOL)removeItemAtPath:path error:err  //删除一个文件 -(BOOL)moveItemAtPa…