Почему я не могу использовать точечную запись в "независимых" блоках?
О блоках 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