Tengo una subclase NSDocument para un editor de texto simple (usando la nueva plantilla de aplicación basada en documentos de Lion, con algunas personalizaciones), y encuentro un extraño error al cargar el contenido del archivo en el almacenamiento de texto.Excepción de codificación confusa en NSTextStorage
Aquí está mi código:
- (void)loadTextContentIntoStorage
{
if (!self.textStorage || !textContentToLoad)
return;
...
[self.textStorage beginEditing];
// NSLog(@"storage: %@ length: %lu textContent: %@", self.textStorage, (unsigned long)self.textStorage.length, textContentToLoad);
// [self.textStorage replaceCharactersInRange:NSMakeRange(0, self.textStorage.length) withString:textContentToLoad];
[self.textStorage replaceCharactersInRange:NSMakeRange(0, 0) withString:@"hello world"];
..
[self.textStorage endEditing];
}
El error ocurre cuando:
- ejecutar la aplicación en Xcode (como una versión de depuración)
- abrir cualquier documento
- salir de la aplicación (sin cerrar el documento)
- ejecutar la aplicación nuevamente desde Xcode
Se bloquea en -replaceCharactersInRange:withString:
con "No se pudieron convertir los bytes en la cadena 0x10004d430 a _NSCStringEncoding".
Pero sólo sucede en cada segundo lanzamiento de la aplicación (un tercio de lanzamiento no se bloqueará, y se automáticamente volver a abrir el documento que se estrelló al intentar abrir la vez anterior). También solo sucede cuando ejecuto la aplicación desde Xcode. Las versiones de lanzamiento nunca se han bloqueado en el lanzamiento.
Pensé que podría ser un problema de codificación con el sistema de guardado automático, pero incluso se bloquea al comentar ese código y simplemente cargar la cadena @ "hello world" en la vista de texto (como se muestra en el código anterior) . Del mismo modo, el comentario NSLog()
no muestra nada extraño. El almacenamiento de texto es válido (se carga desde el archivo xib), la longitud de almacenamiento del texto es 0 y el contenido de texto es el contenido del archivo que se está abriendo.
--- --- EDITAR
que he aprendido este problema está relacionado de alguna manera con el com.apple.security.app-sandbox
derecho. Si los derechos/sandbox son habilitados, entonces mi aplicación no bloquea. Si cualquiera de las autorizaciones o la función de sandbox de la aplicación son deshabilitada, entonces mi aplicación se bloquea en cada segundo lanzamiento tratando de restaurar los documentos abiertos anteriormente.
Solo había notado que se bloqueaba al hacer una compilación/ejecución desde dentro de xcode, porque esa era mi única configuración de compilación con la caja de arena desactivada.
---/EDIT ---
¿Alguien tiene alguna idea? La excepción completo sigue, y el código fuente completo se encuentra en github: https://github.com/abhibeckert/Dux/blob/master/Dux/DuxTextView.m
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Unable to convert bytes in string 0x10004d430 to _NSCStringEncoding'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff84afb286 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff88991d5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff84afb0ba +[NSException raise:format:arguments:] + 106
3 CoreFoundation 0x00007fff84afb044 +[NSException raise:format:] + 116
4 Foundation 0x00007fff835bfae4 copyFromStringToStorage + 262
5 Foundation 0x00007fff835bf979 -[NSBigMutableString replaceCharactersInRange:withString:] + 1000
6 Foundation 0x00007fff835bc3f7 -[NSConcreteMutableAttributedString replaceCharactersInRange:withString:] + 375
7 AppKit 0x00007fff86149e14 -[NSConcreteTextStorage replaceCharactersInRange:withString:] + 81
8 Dux 0x0000000100002f9a -[MyTextDocument loadTextContentIntoStorage] + 1338
9 Dux 0x00000001000022a0 -[MyTextDocument windowControllerDidLoadNib:] + 640
10 AppKit 0x00007fff860f1328 -[NSWindowController _windowDidLoad] + 667
11 AppKit 0x00007fff860e89a3 -[NSWindowController window] + 109
12 AppKit 0x00007fff8615d761 -[NSDocument windowForSheet] + 86
13 AppKit 0x00007fff860e82c4 -[NSDocument _shouldShowAutosaveButtonForWindow:] + 50
14 AppKit 0x00007fff860e7fbb -[NSWindowController setDocument:] + 237
15 AppKit 0x00007fff8629c9b6 -[NSDocument makeWindowControllers] + 139
16 AppKit 0x00007fff8615d555 -[NSDocument(NSPersistentUISupport) restoreDocumentWindowWithIdentifier:state:completionHandler:] + 90
17 AppKit 0x00007fff8615d4aa -[NSDocumentControllerPersistentRestoration loadedDocument:forAutoID:] + 179
18 AppKit 0x00007fff8615cfbe __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_8 + 187
19 AppKit 0x00007fff86148e14 __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_5 + 163
20 AppKit 0x00007fff86148d5f __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_4 + 697
21 AppKit 0x00007fff86148aa1 -[NSDocumentController _openDocumentWithContentsOfURL:usingProcedure:] + 530
22 AppKit 0x00007fff8614868d __-[NSDocumentController reopenDocumentForURL:withContentsOfURL:display:completionHandler:]_block_invoke_3 + 242
23 libdispatch.dylib 0x00007fff8bbbe8ba _dispatch_call_block_and_release + 18
24 libdispatch.dylib 0x00007fff8bbc072a _dispatch_main_queue_callback_4CF + 308
25 CoreFoundation 0x00007fff84a904dc __CFRunLoopRun + 1724
26 CoreFoundation 0x00007fff84a8fae6 CFRunLoopRunSpecific + 230
27 HIToolbox 0x00007fff8852f3d3 RunCurrentEventLoopInMode + 277
28 HIToolbox 0x00007fff8853663d ReceiveNextEventCommon + 355
29 HIToolbox 0x00007fff885364ca BlockUntilNextEventMatchingListInMode + 62
30 AppKit 0x00007fff85ef23f1 _DPSNextEvent + 659
31 AppKit 0x00007fff85ef1cf5 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 135
32 AppKit 0x00007fff85eee62d -[NSApplication run] + 470
33 AppKit 0x00007fff8616d80c NSApplicationMain + 867
34 Dux 0x0000000100001e32 main + 34
35 Dux 0x0000000100001e04 start + 52
36 ??? 0x0000000000000003 0x0 + 3
)
Usted * podría * tener daños en la memoria. ¿Has intentado ejecutar las herramientas de coherencia de memoria disponibles en XCode? (Build and Analyze, Zombies, and the ilk) – voidref
Sí, he intentado construir y analizar, y los zombies están habilitados. También estoy usando ARC. –
Fui a buscar su proyecto porque es fascinante. Permití que el guardia de garabatos y todo eso, todavía nada parecía estar mal. Hay una cantidad de preocupaciones válidas que muestra el Analizador, pero corregirlas no afectó este problema. – voidref