Блок GCD запускает EXC_BAD_ACCESS при вызове
Я делаю приложение MacFUSE Cocoa без сбора мусора, внутри которого я хочу использовать блок GCD в качестве делегата. Тем не менее, моя программа дает сбой во время вызова блока, оставляя только EXC_BAD_ACCESS
в своем следе.
Моя программа использует платформу, созданную на основе Mac OS 10.5 SDK, которая не поддерживает сборку мусора (и не 64-битную), и платформу MacFUSE. Программа собирается без предупреждения или ошибки как 32-битная программа. Остальные параметры сборки (например, уровень оптимизации) были оставлены в исходных значениях.
Итак, у меня есть контроллер приложения, из которого я создаю этот блок и вызываю runWithContinuation:
AFSPasswordPrompt* prompt = [[AFSPasswordPrompt alloc] initWithIcon:icon];
dispatch_block_t continuation = ^{
archive.password = prompt.password;
[self mountFilesystem:fsController];
[prompt performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
};
[prompt runWithContinuation:continuation];
runWithContinuation:
сохраняет блок и создает перо Блок вызывается только после того, как пользователь отклоняет запрос пароля нажатием кнопки "Открыть".
-(void)runWithContinuation:(dispatch_block_t)block
{
continuation = [block retain];
[passwordPrompt instantiateNibWithOwner:self topLevelObjects:NULL];
imageView.image = image;
[window makeKeyWindow];
}
-(IBAction)open:(id)sender
{
continuation();
[self close];
}
-(void)close
{
[window close];
[continuation release];
}
Моя проблема в том, что когда я ударил continuation()
моя программа вызывает EXC_BAD_ACCESS
и последний кадр стека называется ??
, Прямо под ним находится open:
вызов метода.
Я действительно не знаю, откуда это. NSZombies включены, и они ничего не сообщают.
Есть идеи?
1 ответ
Попробуйте скопировать блок вместо того, чтобы сохранить его. Блок живет в стеке до тех пор, пока вы не вызовете copy, затем он копируется в кучу.