周末被一个BUG折腾的欲仙欲死
有一个应用场景:从网上得到大量的文字信息,保存到本地。
因为不停地获取文章,导致本地存储很快就变大。所以想到了简单地压缩。
网上找了一段压缩的代码:
+(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折腾的欲仙欲死的更多相关文章
- 周末发现一个BUG,时有时无,一出程序就崩溃,郁闷了好久,终于跟出来来了,记之,提醒自己今后一定规范编写,只要规范,绝对不会出问题
-- :::] cell0 create -- :::] *** Assertion failure /UITableView.m: -- :::] [ Uncaught Exception ] Na ...
- qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新
qt widget设置Qt::FramelessWindowHint和Qt::WA_TranslucentBackground, 会出现一个bug: 在最小化后还原时界面停止刷新 Widget wit ...
- 从修复 testerhome(rubychina)网站的一个 bug 学习 ruby&rails on ruby
前言 testerhome: http://testerhome.com/topics/1480 对于一个差点脱离前沿技术人,想要学习ruby,就意味着要放弃熟悉的操作系统windows,熟悉的ide ...
- z-index失效原因分析——由一个bug引发的对层叠上下文和z-index属性的深度思考
新年刚开工就被一个bug虐得整个人都不好了,特地记录下. (一)bug描述 在一个fixed-data-table(一个React组件)制作的表格中,需要给表头的字段提示的特效,所以做了一个提示层,但 ...
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- MySQL关于exists的一个bug
今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...
- 由一个bug引发的SQLite缓存一致性探索
问题 我们在生产环境中使用SQLite时中发现建表报“table xxx already exists”错误,但DB文件中并没有该表.后面才发现这个是SQLite在实现过程中的一个bug,而这个bug ...
- Win10系统菜单打不开问题的解决,难道是Win10的一个Bug ?
Win10左下角菜单打不开,好痛苦,点击右下角的时间也没反应,各种不爽,折磨了我好几天,重装又不忍心,实在费劲,一堆开发环境要安装,上网找了很多方法都不适用.今天偶然解决了,仔细想了下,难道是Win1 ...
- 你可能不知道的 NaN 以及 underscore 1.8.3 _.isNaN 的一个 BUG
这篇文章并不在我的 underscore 源码解读计划中,直到 @pod4g 同学回复了我的 issue(详见 https://github.com/hanzichi/underscore-analy ...
随机推荐
- VS2010默认属性文件配置
问题: 在VS2010中,同一个解决方案下有多个项目,都需要使用某一个库. 如果项目比较多,或者编译链接环境属性变动频繁,分别对项目进行配置就很麻烦. 解决: 在VS的配置文件中统一配置属性: 我的配 ...
- easyUI类取嵌套的类型(pastJson结合)
user类: @Entity@Table(name="c_user")public class User { @Id @GeneratedValue(strategy=G ...
- 可滑动的ExpandableListView
可以向左滑动的扩展列表 向左滑动源码是参照GitHub上的里的 ListView的思路写出来的,按照他的思路,由于本人水平有限,只写了关键代码,能够完美运行,adapter改变之后能自动收回. 滑出状 ...
- PHP面试题之驼峰字符串转换成下划线样式例子
自己在看到这个问题的时候,想到的是用ASCII码来处理,没往万能的正则上去想.好吧,下面来看看答案: 答案1: 代码如下 复制代码 $str = 'OpenAPI'; $length = mb_str ...
- taginput ,complete使用笔记
页面用到自动完成功能及需要taginput控件去展示,查资料的过程中发现 有两个类似的jQuery类库,到现在我也没搞明白它们两个有啥关联,jquery.tagsinput.js和bootstrap- ...
- 更新UI界面的四种方法
一.runOnUiThread(new Runnable()): 二.Handler的sendMessage()系列: 三.Handler的post(): 四.View的post():
- PKU 1006
数学问题吧,有兴趣的可以研究一下“中国剩余定理” // 1006.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...
- JavaScript获取一段html片段中a标签的href值
最近,做项目中有一个需求,页面中有一个文本编辑器,里面写的内容最后生成了html代码片段,在另一个页面需要前一个页面文本编辑器的html代码片段中的a标签的href值,就尝试做了,因为不太熟悉js,所 ...
- android4.4以上,快捷实现标题栏透明
方法很简单写一个values-v19的文件夹,当安卓版本大于4.4时便会调用该文件夹下的styles.xml文件 结构如图: styles.xml <resources> <!-- ...
- fatal: Could not read from remote repository.的解决办法
1. git remote –v查看远端地址或者查看配置 git config –list 2. git status 3. git add . git status git commit -m “本 ...