ios开发技巧iOSiOS Development

iOS 拍照黑屏的修复

2015-07-19  本文已影响1373人  Figo_OU

之前做过一款应用,hybrid(UIWebView + Native)混合应用,这款应用有拍照定位功能。但是最近发现拍照的时候会出现闪退问题。找了原因以后发现是占用内存太多了。
所以找个几个方法来减少内存的消耗。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    
//    @autoreleasepool{ //1.
        //omitted.
        UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];
        if (!image)
        {
            image = [info objectForKey:UIImagePickerControllerOriginalImage];
        }
        @autoreleasepool{//2.
        NSData *imageData = 
//3. 4.//////////////////////////////////////////////////////
        UIImageJPEGRepresentation(image,0.5);//第二个参数为压缩系数。
        NSInteger imagesize = (imageData.length)/(1024.0);
        NSData *imgData;
        if (imagesize > 200 ) {//进行压缩
            CGFloat bl = 200 / imagesize;
            imgData = UIImageJPEGRepresentation(image, bl);
        }
        NSInteger imgsize = (imgData.length)/(1024.0);
        image = [UIImage imageWithData:imgData];
        }
/////////////////////////////////////////////////////
        //将图片进行编码,
        NSString *stringImage = [self htmlForJPGImage:image];
        
        //onload='AutoResizeImage(250,250,this)'  alt='200 X 300'
        
        NSString * js = [NSString stringWithFormat:@"var p = document.createElement('p'); p.innerText = '';document.body.appendChild(p);var e = document.createElement('img'); var obj = document.body.appendChild(e);e.src=\"%@\";e.border='0';e.width='100';e.height='100'; e.onload='AutoResizeImage(250,250,this)';e.alt='200 X 300';",stringImage];
        [mywebView stringByEvaluatingJavaScriptFromString:js];
        
        
        [picker dismissViewControllerAnimated:YES completion:nil];
        
//    }
    
}
几种方法的内存消耗图

1.图一为:(在压缩图片的基础上)在代码中加了NSAutoreleasePool。当函数做完时,函数中的变量会释放掉(这个有没有也没神马关系,因为本来函数结束参数就会释放掉)
2.图二为:(在压缩图片的基础上)将图片转成NSData,在NSData使用就马上释放。然而好像也没神马关系。

(建议用这种方法)

3.图三为:将图片转成jpg并将压缩系数改成0.2,将图片压缩后,在看是否大于200,如果大于,继续压缩。然而这个方法就很好使。拍了十张图片都没有蹦。
4.图四为:将将图片转成jpg并将压缩系数改成0.5.其他和方法三一样。

通过图片压缩,可以将拍照发生闪退的问题解决得比较好,但是大家还是可以看到拍照的时候还是会有一个消耗的峰值.这主要是因为使用了苹果系统自带的拍照功能,同事使用第三方的拍照就很好地解决了消耗的峰值问题。(但是我感觉,这个程序上也没神马大问题,就没去继续搞优化了。)如果你有需要,可以联系我,再发峰值消耗的解决方案给你。

demo下载地址:https://github.com/ouzhenxuan/fixThephone
还是那句,如果对你学习又帮助的话,请在github给我点个star吧,求星啊。

上一篇下一篇

猜你喜欢

热点阅读