征服iOSiOS初中级开发iOS 知识点

SDWebImage加载大图导致程序闪退

2017-07-12  本文已影响518人  FallPine

一直加载图片都是用的SDWebImage这个框架,今天在加载多张图片的时候,程序突然崩溃了,真是一脸闷逼,找了好久,最后发现是加载图片导致的。于是上网搜索了一下,原来很多人也遇到了这个问题,按照网上大神提供的方法进行了修改,问题就解决了。

修改SDWebImage框架中的UIImage+MultiFormat.m文件,添加一个等比压缩图片的方法

+(UIImage *)compressImageWith:(UIImage *)image  
{  
    float imageWidth = image.size.width;  
    float imageHeight = image.size.height;  
    float width = 640;  
    float height = image.size.height/(image.size.width/width);  
      
    float widthScale = imageWidth /width;  
    float heightScale = imageHeight /height;  
      
    // 创建一个bitmap的context  
    // 并把它设置成为当前正在使用的context  
    UIGraphicsBeginImageContext(CGSizeMake(width, height));  
      
    if (widthScale > heightScale) {  
        [image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];  
    }  
    else {  
        [image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];  
    }  
      
    // 从当前context中创建一个改变大小后的图片  
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();  
    // 使当前的context出堆栈  
    UIGraphicsEndImageContext();  
      
    return newImage;  
}  

然后还是在这个文件中,在+ (UIImage *)sd_imageWithData:(NSData *)data方法中,对一些大图进行压缩

+ (UIImage *)sd_imageWithData:(NSData *)data {
   .......
#ifdef SD_WEBP
    else if ([imageContentType isEqualToString:@"image/webp"])
    {
        image = [UIImage sd_imageWithWebPData:data];
    }
#endif
    else {
        image = [[UIImage alloc] initWithData:data];
        // 大于300k就对图片进行压缩
        if (data.length/1024 > 300) {
            image = [self compressImageWith:image];
        }
        
        ......


    return image;
}

最后,还要在SDWebImageDownloaderOperation中,参考文章是在connectionDidFinishLoading方法中修改,但我没找到这个方法,最后实在- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error这个方法中进行的修改
在下面代码下方

UIImage *image = [UIImage sd_imageWithData:self.imageData];

添加一下代码

// 将等比压缩过的image在赋在转成data赋给self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];

不知我这么改会不会有其他的问题,但闪退的问题是解决了。以后有修改会再做补充

参考文章:【完美解决SDWebImage加载多个图片内存崩溃的问题】

上一篇下一篇

猜你喜欢

热点阅读