Блок GCD запускает EXC_BAD_ACCESS при вызове - PullRequest
0 голосов
/ 18 ноября 2010

Я делаю приложение 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 Ответ

2 голосов
/ 18 ноября 2010

попробуйте скопировать блок вместо того, чтобы сохранить его. Блок остается в стеке до тех пор, пока вы не вызовете команду copy, затем он копируется в кучу.

...