2013-07-19 3 views
4

Быстрый концептуальный вопрос,UIImagePickerController, когда didFinishPickingMediaWithInfo не реализован

Если я использую UIImagePickerController, и я не реализую didFinishPickingMediaWithInfo, или пытаться обрабатывать возвращаемый UIImage после съемки «принята», что происходит данные UIImage, которые были бы возвращены во время вызова делегата, только что выпущены системой?

После тестирования он, кажется, не течет или не добавляется в стандартную библиотеку фотографий.

Спасибо,

ответ

1

Я не вижу, почему это будет протекать в первую очередь.

Вы должны подумать, что код, написанный разработчиками Apple, уже позволяет освободить изображение, которое камера приняла после завершения вызова делегата. Например, давайте притворимся, что это может выглядеть разработчик (pre-ARC, чтобы показать вам, что вам даже не нужна ARC для этого).

- (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]; 
} 

В примере, если пользователь не retain изображение (или даже не реализовать метод), то Х будет 1, и когда он попадает к конечному release, изображение будет в течение хорошо. Если пользователь сохраняет изображение, изображение будет работать, но словарь, который его поддерживает, может получить dealloc.

Это основная концепция «собственности», которая поставляется с подсчетом ссылок, это как стеклянный шар, который нужно передать вручную, и если у мяча нет руки под ним, он упадет и сломается.

ARC kinda маскирует все это, выполняя его самостоятельно, но основные понятия остаются, право собственности передается на реализацию делегата, и если нет делегата, который его утверждает, он будет удален.

Смежные вопросы