2012-03-31 5 views
0

Ich habe ein Speicherproblem beim Importieren von Fotos aus der Kamerarolle. Ich verwende Storyboard und ARC (automatische Referenzzählung). Wenn ich das 3. oder 4. Foto importiere, stürzt die App ab, und tatsächlich zeigt das Gerät unter freiem physischem Speicher, dass kein Speicher mehr übrig ist. Ich habe versucht, mit @autoreleasepools, aber es scheint nicht zu funktionieren:Speicherverlust beim Importieren von Bildern aus der Fotobibliothek

- (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 
{ 

} 

bitte helfen !! Danke im Voraus.

Antwort

0

Wie behandelt image1.image Besitz.

Verwenden Heapshot zu finden, wo/wie der Speicher verloren: Für HowTo verwenden Heapshot Speicher creap zu finden, siehe: bbum blog

Grundsätzlich gibt Methode Instruments zuteilen Tool auszuführen, eine heapshot nehmen, eine Intuition laufen von Ihrem Code und einem anderen Heapshot, der 3 oder 4mal wiederholt. Dies zeigt Speicher an, der während der Iterationen zugewiesen und nicht freigegeben wurde.

Um herauszufinden, die Ergebnisse offenbaren, um die einzelnen Zuordnungen zu sehen.

Wenn Sie sehen müssen, wo behält, Releases und autoreleases auftreten für ein Objekt verwenden, Instrumente:

Run in Instrumente, in Verrechnungen festlegen „Record Referenzzähler“ auf auf (Sie haben die Aufnahme zu stoppen, die Option setzen). Führen Sie den Picker aus, stoppen Sie die Aufnahme, suchen Sie nach ivar (datePickerView), führen Sie einen Drilldown durch und Sie werden sehen können, wo alle Änderungen, Freigaben und Autoreleases aufgetreten sind.

0

hat gleiches Problem. Verwenden von 2-3 MB für jedes neue Element erstellt. Verantwortlich Anrufer = CGDataProviderCreateWithCopyOfData

Musste gesetzt

imagePicker.allowsEditing = NO; 

Es scheint, dass bei der Bearbeitung des Bildes verwendet wird, das nicht richtig entbindet.

Verwandte Themen