有一个应用场景:从网上得到大量的文字信息,保存到本地。

因为不停地获取文章,导致本地存储很快就变大。所以想到了简单地压缩。

网上找了一段压缩的代码:

+(NSData*)zipContent:(NSString*)strContent
{
NSData* zippedData = nil;
NSData* unzipData =[strContent dataUsingEncoding:NSUTF8StringEncoding];
int nSize =[unzipData length];
Bytef buffer[nSize];
Bytef zipbuffer[nSize];
[unzipData getBytes:buffer]; uLongf zippedLength; int zRet =compress(zipbuffer, &zippedLength, buffer, nSize);
if(Z_OK == zRet)
{
zippedData = [NSData dataWithBytes:zipbuffer length:zippedLength];
} return zippedData;
}

能正常工作,并且很有效地减少了存储空间的使用。

对应地,写了解压的过程:

+(NSString*)unzipContent:(NSData*)zippedData
{
NSString* strContent = nil; int nSize =[zippedData length];
Bytef buffer[1024*1024];
Bytef zipbuffer[nSize];
[zippedData getBytes:zipbuffer]; uLongf unZippedLength=1024*1024;
int zRet =uncompress(buffer, &unZippedLength, zipbuffer, nSize);
if(Z_OK == zRet)
{
strContent = [[NSString alloc] initWithBytes:buffer length:unZippedLength encoding:NSUTF8StringEncoding];
} return strContent;
}

正是上面这两个方法,让我的周末陷入到了欲仙欲死的解BUG过程中。

应用在跑到unzipContent这个方法时,挂了。

堆栈信息显示挂在

watch显示zippedData为nil.

因为从网上拿数据,压缩,解压,显示等过程是处于不同的线程,所以第一时间怀疑是数据在跨线程的使用上出了问题。

一步步分解原因,尝试了很多种解决方法,都无果。每次运行都在断在了上图的位置。方法都没进去,调试信息少的可怜。

最后,灵光一闪,会不会是堆栈信息被破坏掉了?仔细看一下代码,果然,在方法里面申请了大量的栈信息,导致栈溢出了。

修改buffer的空间到堆上。问题果然解决。

周末被一个BUG折腾的欲仙欲死的更多相关文章

  1. 周末发现一个BUG,时有时无,一出程序就崩溃,郁闷了好久,终于跟出来来了,记之,提醒自己今后一定规范编写,只要规范,绝对不会出问题

    -- :::] cell0 create -- :::] *** Assertion failure /UITableView.m: -- :::] [ Uncaught Exception ] Na ...

  2. qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新

    qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...

  3. 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&rails on ruby

    前言 testerhome: http://testerhome.com/topics/1480 对于一个差点脱离前沿技术人,想要学习ruby,就意味着要放弃熟悉的操作系统windows,熟悉的ide ...

  4. z-index失效原因分析——由一个bug引发的对层叠上下文和z-index属性的深度思考

    新年刚开工就被一个bug虐得整个人都不好了,特地记录下. (一)bug描述 在一个fixed-data-table(一个React组件)制作的表格中,需要给表头的字段提示的特效,所以做了一个提示层,但 ...

  5. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

  6. MySQL关于exists的一个bug

    今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...

  7. 由一个bug引发的SQLite缓存一致性探索

    问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...

  8. Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?

    Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...

  9. 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG

    这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...

随机推荐

  1. 在linux使用make编译ArduPilot for Pixhawk/PX4 ArduPilot 编译环境搭建

    Building ArduPilot for Pixhawk/PX4 on Linux with Make 使用Make编译 ArduPilot for Pixhawk 2, Pixhawk and ...

  2. join()方法之我见

    JavaScript join() 方法 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元素是通过指定的分隔符进行分隔的. 语法 arrayObject.join(separa ...

  3. 手机支持USB功能、驱动文件对应关系

    手机支持USB功能: 1.UMS(USB MASS Stronge) : 连接PC作为存储盘使用 2.ADB : 用于调试 3.MTP :连接PC作为存储盘使用(win XP需要安装WMP10 以上 ...

  4. Go语言并发编程示例 分享(含有源代码)

    GO语言并发示例分享: ppt http://files.cnblogs.com/files/yuhan-TB/GO%E8%AF%AD%E8%A8%80.pptx 代码, 实际就是<<Go ...

  5. CABasicAnimation的delegate的坑

    博客已经迁移到 www.chjsun.top 在自定义动画的时候,CABasicAnimation用的还算的蛮多的. 在此先介绍一下CABasicAnimation怎么使用. 属性介绍  属性 说明 ...

  6. Mybatis3.x与Spring4.x整合(转)

    http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetype:cre ...

  7. 画图程序升级版Draw_v1

    // https://github.com/orocos/orocos_kinematics_dynamics/blob/master/orocos_kdl/src/frames.hpp // Vec ...

  8. New Training Table

          2014_8_15 CodeForces 261 DIV2 A. Pashmak and Garden 简单题   B. Pashmak and Flowers    简单题   C. P ...

  9. declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void)" IAR 编译报故障

    原因是以前的CMSIS  CORTEX-CM0 文件太老了.   使用新文件就可以.

  10. Linux学习之路—Linux的历史发展

    1.1969年以前:一个伟大的梦想-Bell,MIT与GE的"Multics"系统 由于早期的计算机不想现在这样普遍,所以往往出现这样的情况,主机只有一台而多人等待使用.好在20世 ...