Как работает управление памятью слабых переменных экземпляра внутри блока, когда ARC включен в Objective-C? - PullRequest
1 голос
/ 27 января 2012

При ссылке на слабый ивар внутри блока в Objective-C, когда включен ARC, сохраняет ли среда выполнения неявно объект, к которому принадлежит ивар? Например:

- (void) foo {
    void (^block)() = ^{
        [_weakIvar doSomethingAwesomeButNotTooAwesome]; // Is self retained here?
    }
    block();
}

Пока мы находимся, как насчет слабого свойства в том же сценарии?

- (void) foo {
    void (^block)() = ^{
        [self.weakProperty doSomethingAwesomeReallyAwesomeDudeYeah];
    }
    block();
}

1 Ответ

2 голосов
/ 27 января 2012

_weakIvar действительно означает self->_weakIvar под капотом, что означает, что (автоматически) сохраняется self. То же самое относится и к self.weakProperty.

В вашем конкретном примере блок не копируется (и используется сразу), поэтому ничего не сохраняется вообще, но если вы делаете (например):

- (void) foo {
    void (^block)() = ^{
        [_weakIvar doSomethingAwesomeButNotTooAwesome];
    }
    dispatch_async(queue, block); // here, block is copied and so self is retained
}
...