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