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/

  • 相关阅读:
    D. Constructing the Array
    B. Navigation System
    B. Dreamoon Likes Sequences
    A. Linova and Kingdom
    G. Special Permutation
    B. Xenia and Colorful Gems
    Firetrucks Are Red
    java getInstance()的使用
    java 静态代理和动态代理
    java 类加载机制和反射机制
  • 原文地址:https://www.cnblogs.com/greywolf/p/2807522.html
Copyright © 2011-2022 走看看