Блок 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, затем он копируется в кучу.

Другие вопросы по тегам