Это не приводит к ошибке «назначение переменной только для чтения»:
NSURL *pathToFile = nil;
[oPanel beginSheetModalForWindow:theWindow completionHandler:^(NSInteger returnCode)
{
if (returnCode == NSOKButton)
pathToFile = [[oPanel URLs] objectAtIndex:0];
}];
return pathToFile;
Да, потому что вы пытаетесь присвоить копии переменной pathToFile
, которая создается при создании блока. Вы не присваиваете исходной переменной pathToFile
, которую вы объявили вне блока.
Вы можете использовать ключевое слово __block
, чтобы позволить блоку присваивать эту переменную, но я не думаю, что это поможет, потому что beginSheetModalForWindow:completionHandler:
не блокирует. (Документация не упоминает об этом, но нет причины для метода блокировать, и вы можете проверить с помощью логирования, что он этого не делает.) Сообщение возвращается немедленно, пока панель еще работает.
Итак, вы пытаетесь присвоить свой блок обработчика завершения локальной переменной, но ваш метод, в котором вы объявили локальную переменную, вероятно, вернется к выполнению блока времени, поэтому он не сможет работать со значением, которое блок оставил оставить в переменной.
Все, что вы делаете с pathToFile
, должно быть либо в самом блоке, либо в методе (с аргументом NSURL *
), который блок может вызвать.