Я только начинаю работать с блоками и Grand Central Dispatch. Мне сказали (и я прочитал в Документации Apple ), что любой объект, на который имеется ссылка из блока, сохраняется.
Например:
^{
self.layer.transform = CATransform3DScale(CATransform3DMakeTranslation(0, 0, 0), 1, 1, 1);
self.layer.opacity = 1;
}
«self» сохраняется, поэтому он просачивается. Чтобы этого избежать, мне нужно назначить себя:
__block Object *blockSelf = self;
, а затем использовать blockSelf
вместо self
внутри моего блока.
У меня вопрос: что произойдет, если ваш блок содержит намного больше кода и ссылается на несколько объектов? Нужно ли назначать их все объектам __ block
? Например:
^{
[self doSomething];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"prevName == %@", artistName];
[request setEntity:entity];
[request setPredicate:predicate];
Object *newObject = [[Object alloc] init];
[someArray addObject];
[newObject release];
}