GCD Block срабатывает EXC_BAD_ACCESS на
-
25-09-2019 - |
Вопрос
Я делаю без мусора, собранного 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 включены, и они ничего не сообщают.
Есть идеи?
Решение
Попробуйте копировать блок вместо того, чтобы сохранить его. Блок живет в стеке, пока вы не позвоните копию, то он скопирован в кучу.