tzjut

导航

周末被一个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的空间到堆上。问题果然解决。

 

posted on 2013-07-15 08:44  tzjut  阅读(430)  评论(0)    收藏  举报