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é.