Вопрос

Я делаю без мусора, собранного MacFuse Cocoa, внутри которого я хочу использовать блок GCD в качестве делегата. Тем не менее, моя программа вылетает во время вызова блока, оставляя только EXC_BAD_ACCESS в ее тропе.

Моя программа использует Framework, построенные снова Mac OS 10.5 SDK, которая не поддерживает сбор мусора (ни 64 бит) и MacFuse Framework. Программа строит без предупреждения или ошибки в качестве 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 включены, и они ничего не сообщают.

Есть идеи?

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top