Почему я не могу использовать точечную запись в "независимых" блоках?

О блоках Objective-c в документе, который я читаю, сказано:

Вы не можете ссылаться на self в независимом блоке объектов. если вам нужно, вы должны пройти self объект в блоке в качестве параметра.

Вы не можете получить доступ к свойствам объекта внутри независимого блока, используя точечную запись. Если вам нужно сделать это, используйте методы setter и getter.

Но я могу написать следующее, и он работает, как ожидалось.

- (void)testing
{
    self.name = @"wahaha";
    void (^independentBlock)(NSString *arg) = ^(NSString *arg){
        self.name = @"";
        NSLog(@"%@ -- %@",arg, self.name);
    };

    a(@"abcd"); // abcd -- wahaha
}

Итак, почему правила говорят, что точечная нотация не может быть использована?

1 ответ

Решение

Эта цитата кажется неверной, хотя они могут пытаться понять, что вы не должны использовать себя в независимых блоках. в приведенном вами примере все будет в порядке, но проблема возникает, когда блок хранится и используется где-то еще.

если на self ссылаются внутри блока, он сохраняет сильную ссылку на него, и если у блока есть ссылка внутри 'self' (каким бы ни был self), у вас будет цикл сохранения и утечка памяти из-за невозможности дуги чтобы очистить их, так как они все еще имеют сильные ссылки друг на друга.

Вы можете исправить это, объявив переменную, указывающую на себя, которая слаба

__weak <#TypeOfSelf#> weakSelf = self; //use weakSelf in your block
Другие вопросы по тегам