Я делаю приложение 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 включены, и они ничего не сообщают.
Есть идеи?