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

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

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

+(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. boost和C++11中的sleep

    boost boost线程中表示睡眠的函数有sleep和sleep_for sleep 例如: boost::this_thread::sleep(boost::posix_time::seconds ...

  2. Beagleboard xm sd卡恢复

    来源于:http://circuitco.com/support/index.php?title=BeagleBoard-xM windows下恢复更加简单,推荐windows系统下恢复. To in ...

  3. python时间时分秒与秒数的互相转换

    受到Unix时间戳的启发,我发现时间转成秒数后会非常好处理,在程序当中不再是以字符串的形式处理,不管时间的加减还是获取随机的时间点都变得非常方便, 如果有需要,也很容易转换成需要的时间格式. 一:时间 ...

  4. MVC与webservice上传文件(图片和视频),希望帮且到一些朋友

    最近做一个项目,要把图片和视频传到服务器上(网站与图片服务器分开),在网上找了好久,没找到完整的资料. 自己也折腾了半天,才把完整的代码实现完.可能好多朋友都有实现过,没分享代码吧,写得不好希望不要见 ...

  5. block的常见用法

    一.声明和定义 1.声明 声明方式:返回值(^block)(参数).声明时,参数变量名可以省略:使用时,参数变量名不能省略,不然会无法调用传入的参数 void(^block)(); void(^blo ...

  6. Ubuntu下libpcap安装

    1.首先按下面的博客教程下载和安装四个软件包: 点击打开链接 2.这四个软件都安装好之后按下面教程新建Makefile文件和test.c文件: 点击打开链接 Makefie: all: test.c ...

  7. BZOJ 1799 同类分布

    一开始没想出来..一看题解 我艹直接枚举数位的和啊.....怪不得给50s. 还是太蠢. #include<iostream> #include<cstdio> #includ ...

  8. NOIP 考前 KMP练习

    BZOJ 1461 && BZOJ 1729 KMP+BIT 一看就是字符串匹配但是不同的是要按照每个字符的排名情况. 首先对于数字x的排名,那么要判断x前小于x的数的个数,和x前小于 ...

  9. js中遍历出查询后的listmodel(下拉框系列)

    function selectclassname(){ $.ajax({ url:"queryschoolclasslists.action", async:false, data ...

  10. 第七周——Linux内核如何装载和启动一个可执行程序

    万子惠 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 part1 实验 ...