iOS 拍照黑屏的修复

作者: Figo_OU | 来源:发表于2015-07-19 12:51 被阅读1373次

之前做过一款应用,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吧,求星啊。

相关文章

网友评论

  • 单线程小屁孩怎么了:写得不错,现在也在做hybird应用,拍照遇到同样的问题,向你学习一下如何解决峰值的问题,能发解决方案过来参考一下吗:blush:
  • ddaa8dae50b0:autoreleasepool 一般用在循环里面. 如果循环每次都要创建局部变量, autoreleasepool可以保证循环一次就释放一次, 你这么用的确没效果
  • cfed2920e4f8:写的不错,学习了
  • Figo_OU: @yunFeng 之前有写过文章提到phonegap,可以去看看。其实想学好这个js还是要挺扎实的,这框架最大的好处就是用js来写页面,多平台,快速开发。native的话之前文章有提如何使用
  • yunFeng:求cordova教程,跪谢啊

本文标题:iOS 拍照黑屏的修复

本文链接:https://www.haomeiwen.com/subject/ztjpqttx.html