zoukankan      html  css  js  c++  java
  • UIImagePickerController之死因

    UIImagePickerController是我们最常用的组件之一,用它可以实现照相,选图片的功能。但是在照像的时候,如果后台开有很多应用,经常会出现crash的情况,是因为照出来的相片像素太高,一般是4M左右,照一张就会有4M内存占用,于是经常会出现memory warning, 然后系统回收内存,就使我们的应用crash。

    解决方法就是,在UIImagePickerControllerDelegate方法中启用一个线程来crop我们照出来的image,如下:

    1. - (void)imagePickerController:(UIImagePickerController *)picker 
    2.                     didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    3.   [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    4.   UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    5.   [NSThread detachNewThreadSelector:@selector(useImage:) toTarget:self withObject:image]; 

    在useImage:方法是裁剪相片,使其占用更小的内存,

    1. - (void)useImage:(UIImage *)image { 
    2.   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    3. // Create a graphics image context
    4.   CGSize newSize = CGSizeMake(320, 480); 
    5.   UIGraphicsBeginImageContext(newSize); 
    6. // Tell the old image to draw in this new context, with the desired
    7. // new size
    8.   [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; 
    9. // Get the new image from the context
    10.   UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    11. // End the context
    12.   UIGraphicsEndImageContext(); 
    13.   [userPhotoView setImage:newImage]; 
    14.   [pool release]; 

    这样做以后,虽然有memory warning也不至于crash.

    在此我分享一下另一个经验,如果我们的view都放在一个xib里,那么很可以造成内存警告,所以最好是一个xib对应一个view,当这个view需要的时候,才加载,不需要的时候就释放。避免hide这类的操作,因为hide其实还占有内存,只是不显示出来。

    参考资料:http://wiresareobsolete.com/2010/08/uiimagepickercontroller/

  • 相关阅读:
    Nginx配置SSL证书实现https访问及端口映射
    Nginx动静分离实现
    Nginx+Keepalived实现高可用部署
    Linux环境Nginx反向代理实现负载均衡
    Linux环境Nginx安装
    merlin矿池被攻击详情
    CVE-2021-26855 Exchange Server RCE
    C语言博客作业04--数组
    第四次作业
    SpringBoot集成多数据源-----基于数据库维护
  • 原文地址:https://www.cnblogs.com/greywolf/p/2807522.html
Copyright © 2011-2022 走看看