У меня есть код с явным эталонным циклом в блоке ivar. Следующий код вызывает опорный цикл и dealloc никогда не называют:__block self reference cycle в блоке ivar в ARC
__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];
});
}
};
Просто хочу понять, что здесь происходит.
Отлично, спасибо! Я обновил заголовок моего вопроса, чтобы быть более наглядным. –
Я ориентируюсь на iOS 4.3, поэтому мне пришлось использовать '' __unsafe_unretained'', но это работает, спасибо! –