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/

  • 相关阅读:
    借壳上市[来自百度]
    DIY协同办公平台(C/S)系列3之内部邮箱篇
    测试用例设计场景法
    客户关系管理系统提高企业对客户的响应速度
    CRM--销售管理的灵药
    CRM的两个问题
    需求分析是CRM系统实施的关键
    如何实施CRM客户关系管理系统
    CRM的三重境界
    企业需要更好的认识客户关系管理系统
  • 原文地址:https://www.cnblogs.com/greywolf/p/2807522.html
Copyright © 2011-2022 走看看