NSMutableData接收完数据后,访问异常,大神指点! 本帖最后由 wolf_y 于 2014-10-28 16:57:49 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 原因很明显,receivedData 为nil 而导致的异常。那就找找为什么会是nil ? 假设在- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data中 返回的data 没有值,在使用data.length 在判断的时候有可能会因不满足条件而无法进入判断的语句体,也就无法执行这句代码:receivedData = [NSMutableData dataWithData:data];来对receivedData 进行实例。也就是receivedData 的值为空nil 当执行到代理方法- (void)connectionDidFinishLoading:(NSURLConnection *)connection 时,在判断 if (receivedData.length==0) 时因receivedData为nil,而导致程序的异常正确的做法:在外部定义并预先实例化好receivedData对象 调试didReceiveData方法中确实有值,receivedData接受以后的长度1024,这个方法每次都正常,而且断点只进入了一次。但是一到connectionDidFinishLoading方法,receivedData就不正常了。在外部定义receivedData是这样的,NSMutableData *receivedData ;那到底什么时候receivedData这个指针变为空了呢?难道其实不是同一个线程? 调试didReceiveData方法中确实有值,receivedData接受以后的长度1024,这个方法每次都正常,而且断点只进入了一次。但是一到connectionDidFinishLoading方法,receivedData就不正常了。在外部定义receivedData是这样的,NSMutableData *receivedData ;那到底什么时候receivedData这个指针变为空了呢?难道其实不是同一个线程?难道receivedData被提前释放了? 使用[NSMutableData dataWithData:data]; 静态方法创建实例,它应该是一个autorelease 的对象,说不好在某一时刻被清理。所以你可以尝试将receivedData声明为属性,来帮助你来管理内存。 调试didReceiveData方法中确实有值,receivedData接受以后的长度1024,这个方法每次都正常,而且断点只进入了一次。但是一到connectionDidFinishLoading方法,receivedData就不正常了。在外部定义receivedData是这样的,NSMutableData *receivedData ;那到底什么时候receivedData这个指针变为空了呢?难道其实不是同一个线程?难道receivedData被提前释放了? 使用[NSMutableData dataWithData:data]; 静态方法创建实例,它应该是一个autorelease 的对象,说不好在某一时刻被清理。所以你可以尝试将receivedData声明为属性,来帮助你来管理内存。先谢谢了!终于有写思路了,我对这个文件加了-fno-objc-arc,禁用了arc,调试发现receivedData这个在connectionDidFinishLoading中是0 object.应该确实是提前被释放了。为什么禁用了arc,这个还是被提前清理了呢? 上传一张receivedData的图片。 IOS应用程序开发问题 纯C代码中如何调用Object-C中的方法? 交了99美元后怎么使用啊,付款已经成功。接下来怎么做 iPhone开发概念问题!请多多指教! iphone创建浮点像素的BitmapContext为什么不能成功,返回null 新手求教UITableView的问题 剁手!!!!xcode误操作问题! IOS中View之间如何异步通信? 请问下IOS怎样监听屏幕解锁 使用不了isEqualToString 想改变一个APP的屏幕方向,有没有办法? UITableViewCell 中添加UIView
假设在
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
中 返回的data 没有值,在使用data.length 在判断的时候有可能会因不满足条件而无法进入判断的语句体,也就无法执行这句代码:
receivedData = [NSMutableData dataWithData:data];
来对receivedData 进行实例。也就是receivedData 的值为空nil
当执行到代理方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
时,在判断 if (receivedData.length==0) 时因receivedData为nil,而导致程序的异常正确的做法:
在外部定义并预先实例化好receivedData对象
但是一到connectionDidFinishLoading方法,receivedData就不正常了。
在外部定义receivedData是这样的,NSMutableData *receivedData ;
那到底什么时候receivedData这个指针变为空了呢?
难道其实不是同一个线程?
但是一到connectionDidFinishLoading方法,receivedData就不正常了。
在外部定义receivedData是这样的,NSMutableData *receivedData ;
那到底什么时候receivedData这个指针变为空了呢?
难道其实不是同一个线程?
难道receivedData被提前释放了? 使用
[NSMutableData dataWithData:data]; 静态方法创建实例,它应该是一个autorelease 的对象,说不好在某一时刻被清理。所以你可以尝试将receivedData声明为属性,来帮助你来管理内存。
但是一到connectionDidFinishLoading方法,receivedData就不正常了。
在外部定义receivedData是这样的,NSMutableData *receivedData ;
那到底什么时候receivedData这个指针变为空了呢?
难道其实不是同一个线程?
难道receivedData被提前释放了? 使用
[NSMutableData dataWithData:data]; 静态方法创建实例,它应该是一个autorelease 的对象,说不好在某一时刻被清理。所以你可以尝试将receivedData声明为属性,来帮助你来管理内存。
先谢谢了!终于有写思路了,我对这个文件加了-fno-objc-arc,禁用了arc,
调试发现receivedData这个在connectionDidFinishLoading中是0 object.应该确实是提前被释放了。
为什么禁用了arc,这个还是被提前清理了呢?
上传一张receivedData的图片。