__ цикл самостоятельной ссылки блока в блоке ivar в ARC

У меня есть код с очевидным ссылочным циклом в блоке ivar. Следующий код вызывает ссылочный цикл, и метод dealloc никогда не вызывается:

__block MyViewController *blockSelf = self;

loggedInCallback = ^(BOOL success, NSError *error){
    if (success)
    {
        double delayInSeconds = 1.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        {
            [blockSelf.delegate loginDidFinish];
        });            
    }
};

Однако, если я создаю другую переменную __ block для хранения ссылки на моего делегата для захвата области блока, ссылочный цикл исчезает:

__block id <MyViewControllerDelegate> blockDelegate = self.delegate;

loggedInCallback = ^(BOOL success, NSError *error){
    if (success)
    {
        double delayInSeconds = 1.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        {
            [blockDelegate loginDidFinish];
        });            
    }
};

Просто хочу понять, что здесь происходит.

9
задан Joshua Weinberg 18 January 2012 в 19:25
поделиться