Почему этот вызов Objective C зависает?

Мой друг обнаружил странное поведение с NSDictionary, и мне любопытно, почему это происходит. Рассмотрим следующий код:

NSDictionary *dict = [[NSDictionary alloc] init];

// Oops, we can't mutate an NSDictionary
[dict setObject:[[NSNull alloc] init] forKey:@"test"];
NSLog(@"Set");

Код выдает предупреждение при компиляции, что «NSDictionary может не отвечать на setObject: forKey:». Это все хорошо, и если вы все равно запустите его, вы получите следующий вывод в консоли:

- [__ NSCFDictionary setObject: forKey:]: метод изменения, отправленный в неизменяемый объект

Опять же, именно то, что вы ' я ожидал, что произойдет. Однако в этот момент приложение не аварийно завершает работу и не завершает работу из-за неперехваченного исключения. Метод setObject: forKey: просто никогда не возвращается, и кажется, что приложение зависает; следующий NSLog никогда не выполняется. Если вы попытаетесь перейти или войти в метод с помощью GDB, отладка просто завершится, но без явного сообщения об ошибке. Приложение продолжает работать, но отладчик не дает понять, где в коде выполнение «застревает».

Что здесь происходит? Что на самом деле делает приложение в этом случае и почему оно не вылетает из-за исключения NSInternalInconsistencyException или чего-то подобного?

Изменить : Для тех, кто спросил, я использую XCode 4.1 на OS X Lion (10.7.2), сборка выполняется с помощью "компилятора Apple LLVM 2.1." Я использую все настройки по умолчанию, которые вы получаете с новым проектом Cocoa в XCode 4.Я наблюдаю одно и то же поведение без сбоев независимо от того, отлаживаю ли я программу или просто «Запускаю» ее. Переход от сборки отладки к сборке выпуска не имеет значения. Я даже могу найти файл .app вручную в Finder и дважды щелкнуть по нему, чтобы запустить его вне XCode, и он по-прежнему не дает сбоев.

6
задан Robert Harvey 19 January 2012 в 03:28
поделиться