2015-04-26 4 views
0

Я хотел понять следующий сценарийПонимание сильный указатель и выходит за рамки

-(void) foo 
{ 
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                 message:@"Could not save file" 
                 delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 

     [alert show]; 

} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    //This is called when ok is pressed 
} 

В приведенном выше коде создается UIAlertView сильный указатель и делегатом на себя назначается. Причина, по которой я назвал это сильным ссылочным указателем, состоит в том, что он создан в области видимости и выходит из области видимости, когда его счетчик ссылок равен 0. Я считаю, что счетчик ссылок равен 0, когда заканчивается метод foo, почему я все еще получаю обратный вызов на clickedButtonAtIndex? Я был в предположении, что мы не получим обратный вызов, потому что деструктор экземпляра alertView был бы вызван, как только закончится метод foo.

ответ

3

Я считаю, что количество ссылок идет на 0

Вы верите, что неправильно. Когда вы говорите [alert show], вы передаете объект предупреждения в Cocoa, который сохраняет его; в противном случае на экране не появлялось предупреждение. Этот вид предупреждения имеет ссылку (которая на самом деле слаба) для вас (self). И Cocoa, таким образом, может передать вам тот же самый вид предупреждения в обратном вызове делегата; предупреждение все еще живое, потому что Cocoa все еще сохраняет его, и вы все еще живы, потому что вы все еще живы, поэтому ссылка на self работает как цель обратного вызова.

Кроме того, я не могу точно сказать, понять ли вы, что как только вы говорите [alert show], код делает не пауза - он идет прямо, немедленно. Таким образом, первый метод - над, прежде чем на экране появится предупреждение. Опять же, это работает, потому что предупреждение передано Cocoa, которое сохраняет его и позаботится показать его на следующей runloop. Ни один из ваш код не работает, пока на экране присутствует предупреждение.

Полностью параллельная ситуация

MyViewController* vc = [MyViewController new]; 
[self.presentViewController:vc animated:YES completion:nil]; 

код заканчивается, так почему не MyViewController исчезают в клубах дыма? Потому что presentViewController передает его какао, который вставляет его в иерархию контроллера вида и сохраняет его.

+0

И посмотрите мою книгу: http://www.apeth.com/iOSBook/ch19.html#_view_controller_and_view_creation – matt

+0

И, конечно же, есть ситуации _lots_, в которых вы передаете объект какао и какао, сохраняя его: http: // www.apeth.com/iOSBook/ch12.html#_how_cocoa_objects_manage_memory – matt

+0

Спасибо за очистку этого сообщения - отмечен как ответ после таймера – Rajeshwar

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