2013-07-19 3 views
4

Une question conceptuelle rapide,UIImagePickerController, quand didFinishPickingMediaWithInfo pas mis en œuvre

Si j'utilise UIImagePickerController, et je ne mettons pas en œuvre didFinishPickingMediaWithInfo, ou tenter de gérer le retour UIImage après une image « prise », ce qui se passe à les données UIImage qui auraient été retournées au cours de l'appel du délégué, est-ce que le système vient juste de le publier? Après le test, il ne semble pas qu'il y ait une fuite ou qu'il soit ajouté à la bibliothèque Photos standard.

Merci,

Répondre

1

Je ne vois pas pourquoi il serait fuite en premier lieu.

Vous devez penser que le code que les développeurs Apple ont déjà écrit veille à libérer l'image prise par la caméra une fois l'appel du délégué terminé. Par exemple, supposons que c'est ce à quoi le développeur pourrait ressembler (avant ARC, pour vous montrer que vous n'avez même pas besoin d'ARC pour cela).

- (IBAction)userDidPressAccept:(id)sender 
{ 
    // Obtain image from wherever it came from, this image will start with 
    // Retain Count: 1 
    UIImage *image = [[UIImage alloc] init]; 

    // Build an NSDictionary, and add the image in 
    // Image Retain Count: 2 
    NSDictionary *userInfo = [[NSDictionary alloc] initWithObjectsAndKeys:image, UIImagePickerControllerOriginalImage, ..., nil]; 

    // Now the dictionary has ownership of the image, we can safely release it 
    // Image Retain Count: 1 
    [image release]; 

    if ([self.delegate respondsToSelector:@selector(imagePickerController:didFinishPickingMediaWithInfo:)]) 
    { 
     // Guy sees what he does with his image 
     // Image Retain Count: X (Depends on the user) 
     [self.delegate imagePickerController:self didFinishPickingMediaWithInfo:image]; 
    } 

    // Ok, we're done. Dictionary gets released, and it can no longer own the image 
    // Image Retain Count: X-1 (Depends on the user) 
    [userInfo release]; 
} 

Dans l'exemple, si l'utilisateur n'a pas retain l'image (ou n'a pas appliqué la méthode même), alors X sera 1, et quand il arrive à la release finale, l'image sera parti pour bien. Si l'utilisateur conserve l'image, l'image restera active, mais le dictionnaire qui l'a pris en charge peut recevoir dealloc. C'est le concept de base de la "propriété" qui vient avec le comptage des références, c'est comme une boule de verre qui doit être passée à la main, et si la balle n'a pas de main sous elle, elle tombera et se cassera. L'ARC cache un peu tout cela en le faisant lui-même, mais les concepts de base restent, la propriété est transférée à l'implémentation du délégué, et s'il n'y a pas de délégué qui le réclame, il sera supprimé.

Questions connexes