• 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/

  • 相关阅读:
    如何有效的遍历django的QuerySet
    python进程池剖析(三)
    python进程池剖析(二)
    python进程池剖析(一)
    条件变量signal与unlock的顺序
    智能指针与句柄类(四)
    解析正则 /(d)(?=(d{3})+.)/g
    原生JS实现增加删除class
    RN 热更新
    Windows下搭建IOS开发环境
  • 原文地址:https://www.cnblogs.com/greywolf/p/2807522.html
Copyright © 2020-2023  润新知