ObjC: плохой доступ при вызове блоков ^ {} в последующих функциях?
Следуя этомуобсуждениеЯ столкнулся с проблемой плохого доступа;
Цикл имеет несколько шагов: a, b, c, ... x, y, z:
-(void)cycle:(float)delta{
[self stepA]
[self stepB]
// etc.
[self stepZ]
}
В какой-то момент шаг x делает следующее:
// IRQ is an NSMutableArray
// Self is a reference to the engine running the cycles
[IRQ addObject:^{ NSLog(@"hello! %@", self); } ];
Позже, шаг z должен обработать все «задержанные» звонки:
for (int i = 0; i < [IRQ count]; i++){
void (^delayedCall)(void) = [IRQ objectAtIndex:i];
delayedCall();
}
[IRQ removeAllObjects];
Результат: EXEC_BAD_ACCESS
Теперь, если шаг x добавляет только простую строку без ссылки на объект, как показано ниже, шаг Z работает нормально:
[IRQ addObject:^{ NSLog(@"hello!"); } ];
Последнее наблюдение: если один и тот же шаг добавляет блоки в очередь И выполняет итерации по очереди для выполнения блоков, то никаких проблем не возникает. Подобно тому, как ссылка на объект «теряется» как шаг: метод оставлен?
Я не очень разбираюсь в этой области и мне понадобится дополнительная помощь!
редактировать: Джеймс, только что попробовал следующее, чтобы избежать этого ссылочного стиля:
NSString *userName = @"James";
[IRQ addObject:^{ NSLog(@"hello %@", userName); } ];
и это тоже бывает. Как ваше решение применимо к этому?
Заранее спасибо!