Необъяснимый сбой / утверждение NSUndoManager в приложении Какао - PullRequest
1 голос
/ 05 сентября 2010

У меня странная проблема с приложением Cocoa, OpenGL, над которым я работаю. Всякий раз, когда я запускаю свое приложение, я получаю следующие сообщения / ошибки подтверждения на консоли, связанные с NSUndoManager. Кстати, я не пользуюсь менеджером отмены.

2010-09-05 03:28:49.184 CocoaCoreTest[51721:a0f] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-751.29/Misc.subproj/NSUndoManager.m:271<br> 2010-09-05 03:28:49.188 CocoaCoreTest[51721:a0f] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.<br> 2010-09-05 03:28:49.189 CocoaCoreTest[51721:a0f] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /SourceCache/Foundation/Foundation-751.29/Misc.subproj/NSUndoManager.m:271<br> 2010-09-05 03:28:49.190 CocoaCoreTest[51721:a0f] An uncaught exception was raised 2010-09-05 03:28:49.190 CocoaCoreTest[51721:a0f] +[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.<br> 2010-09-05 03:28:49.192 CocoaCoreTest[51721:a0f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.'<br> *** Call stack at first throw: ( 0 CoreFoundation 0x00007fff83e97cc4 __exceptionPreprocess + 180<br> 1 libobjc.A.dylib 0x00007fff883bb0f3 objc_exception_throw + 45<br> 2 CoreFoundation 0x00007fff83e97ae7 +[NSException raise:format:arguments:] + 103<br> 3 Foundation 0x00007fff84cf2d5a -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198<br> 4 Foundation 0x00007fff84c4b936 +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 140<br> 5 AppKit 0x00007fff823219f9 -[NSApplication run] + 689<br> 6 AppKit 0x00007fff8231a5f8 NSApplicationMain + 364<br> 7 CocoaCoreTest 0x000000010003b753 main + 33<br> 8 CocoaCoreTest 0x0000000100021608 start + 52<br> 9 ??? 0x0000000000000001 0x0 + 1<br> ) terminate called after throwing an instance of 'NSException'

Я запускаю свой графический интерфейс в главном потоке, и на самом деле я не создаю никаких других потоков. Я получаю этот сбой в режиме отладки и выпуска, когда я компилирую для x86_64. Однако, что интересно, эта ошибка не возникает при компиляции для i386.

Спасибо за вашу помощь!

Florian

1 Ответ

1 голос
/ 06 сентября 2010

Я использую локальное хранилище потока POSIX. Делая мои переменные TLS регулярными, глобальные переменные потока смягчают сбой, хотя мое приложение в настоящее время является однопоточным, т.е. в каждой переменной должен быть только один экземпляр TLS.

Любые комментарии о том, почему POSIX TLS может не работать с какао. Это известная проблема?

...