2012-03-31 50 views
0

我在从相机胶卷导入照片时遇到内存问题。我正在使用故事板和ARC(自动引用计数)。当我导入第三张或第四张照片时,应用程序崩溃,实际上仪器在空闲物理内存下显示没有剩余内存。我尝试使用@autoreleasepools,但它似乎并没有工作:从照片库导入图像时发生内存泄漏

- (void)viewDidLoad { 
@autoreleasepool { 
[super viewDidLoad]; 

UIBarButtonItem *cameraButton = [[UIBarButtonItem alloc] 
           initWithTitle:@"Camera" 
           style:UIBarButtonItemStyleBordered 
           target:self 
           action:@selector(useCamera:)]; 

UIBarButtonItem *cameraRollButton = [[UIBarButtonItem alloc] 
            initWithTitle:@"Camera Roll" 
            style:UIBarButtonItemStyleBordered 
            target:self 
            action:@selector(useCameraRoll:)]; 
NSArray *items = [NSArray arrayWithObjects: cameraButton, 
        cameraRollButton, nil]; 
[toolbar setItems:items animated:NO]; 

mouseMoved = 0; 

}} 

- (IBAction) useCamera: (id)sender 
{ 
if ([UIImagePickerController isSourceTypeAvailable: 
    UIImagePickerControllerSourceTypeCamera]) 
{ 
    UIImagePickerController *imagePicker = 
    [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType = 
    UIImagePickerControllerSourceTypeCamera; 
    imagePicker.mediaTypes = [NSArray arrayWithObjects: 
           (NSString *) kUTTypeImage, 
           nil]; 
    imagePicker.allowsEditing = NO; 
    [self presentModalViewController:imagePicker 
          animated:YES]; 

    newMedia = YES; 

    }else{ 
    NSLog(@"Camera is not available"); 
    UIAlertView *alert1 = [[UIAlertView alloc] initWithTitle:@"Important message" message:@"Unfortunately the camera is not available on your device." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil]; 
    [alert1 show]; 
} 

} 

- (IBAction) useCameraRoll: (id)sender 
{ 
@autoreleasepool { 

    if ([self.popoverController isPopoverVisible]) { 
    [self.popoverController dismissPopoverAnimated:YES]; 

    } else{ 

    }{ 
    if ([UIImagePickerController isSourceTypeAvailable: 
     UIImagePickerControllerSourceTypeSavedPhotosAlbum]) 
    { 
     @autoreleasepool { 

     UIImagePickerController *imagePicker = 
     [[UIImagePickerController alloc] init]; 

     imagePicker.delegate = self; 
     imagePicker.sourceType = 
     UIImagePickerControllerSourceTypePhotoLibrary; 
     imagePicker.mediaTypes = [NSArray arrayWithObjects: 
            (NSString *) kUTTypeImage, 
            nil]; 

     imagePicker.allowsEditing = YES; 

     self.popoverController = [[UIPopoverController alloc] 
            initWithContentViewController:imagePicker]; 
     } 
     popoverController.delegate = self; 

     [self.popoverController 
     presentPopoverFromBarButtonItem:sender 
     permittedArrowDirections:UIPopoverArrowDirectionUp 
     animated:YES]; 


     newMedia = NO; 
    }} 
} 
} 

-(void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    [self.popoverController dismissPopoverAnimated:true]; 
    @autoreleasepool { 


NSString *mediaType = [info 
         objectForKey:UIImagePickerControllerMediaType]; 

    if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) { 
    UIImage *image = [info 
         objectForKey:UIImagePickerControllerOriginalImage]; 

    image1.image = image; 
    if (newMedia) 
     UIImageWriteToSavedPhotosAlbum(image, 
             self, 
              @selector(image:finishedSavingWithError:contextInfo:), 
             nil); 
} 
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) 
{ 
    // Code here to support video if enabled 
}} 
} 

-(void)image:(UIImage *)image 
finishedSavingWithError:(NSError *)error 
contextInfo:(void *)contextInfo 
{ 
if (error) { 
    UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle: @"Save failed" 
          message: @"Failed to save image"\ 
          delegate: nil 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil]; 
    [alert show]; 
} 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker 
{ 

} 

请帮助!提前致谢。

回答

0

image1.image如何处理所有权。

使用Heapshot寻找到/记忆是如何迷失: 至于如何使用Heapshot查找内存creap,请参阅:bbum blog

基本上有方法是运行仪器分配工具,采取heapshot,运行直觉的代码和另一个heapshot重复3或4次。这将指示在迭代过程中分配并未释放的内存。

为了弄清楚结果是否披露了个别分配。

如果你需要看到保留,发布和自动释放出现一个对象使用仪器:在仪器

运行,在设定“记录的引用计数”关于分配(你必须停止记录设置的选项)。导致选择器运行,停止录制,在那里搜索ivar(datePickerView),向下钻取,您将能够看到所有保留,发布和自动释放发生的位置。

0

有同样的问题。 为每个创建的新项目使用2-3 MB。 负责呼叫者= CGDataProviderCreateWithCopyOfData

必须设置

imagePicker.allowsEditing = NO; 

看来,使用编辑图像时,这并不正确地释放。