gpt4 book ai didi

objective-c - 混淆 NSTextStorage 中的编码异常

转载 作者:太空狗 更新时间:2023-10-30 03:13:47 28 4
gpt4 key购买 nike

我有一个用于简单文本编辑器的 NSDocument 子类(使用 Lion 基于文档的新应用程序模板,几乎没有自定义),我遇到了一个奇怪的错误,将文件内容加载到文本存储中。

这是我的代码:

- (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];
}

错误发生在我:

  • 在 Xcode 中运行应用程序(作为调试版本)
  • 打开任何文档
  • 退出应用程序(不关闭文档)
  • 再次从 Xcode 运行应用

它在 -replaceCharactersInRange:withString: 中崩溃,显示“无法将字符串 0x10004d430 中的字节转换为 _NSCStringEncoding”。

但它只会在应用程序每次 第二次 启动时发生(第三次启动不会崩溃,并且它自动重新打开它试图打开时崩溃的文档上一次)。它也仅在我从 Xcode 运行应用程序时发生。发布构建从未在启动时崩溃。

我认为这可能是自动保存系统的编码问题,但当我注释掉该代码并将@"hello world"字符串加载到 TextView 中时它甚至会崩溃(如上面的代码所示)。同样,被注释掉的 NSLog() 也没有表现出任何异常。文本存储有效(从xib文件加载),文本存储长度为0,textContent为正在打开的文件内容。

--- 编辑 ---

我了解到这个问题在某种程度上与 com.apple.security.app-sandbox 权利有关。如果权利/沙箱被启用,那么我的应用不会崩溃。如果权利或应用程序沙盒功能被禁用,那么我的应用程序在每次启动时都会崩溃,试图恢复以前打开的文档。

我只是在从 xcode 内部执行构建/运行时才注意到它崩溃,因为那是我唯一禁用沙箱的构建配置。

---/EDIT ---

有人有什么想法吗?完整的异常如下,完整的源代码在 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
)

最佳答案

我承认,这个问题难倒了我好一阵子。不过,我想我终于找到了复制品。

浏览 GNUstep code that emulates this behavior ,我找到了以下源代码:

if (enc == NSASCIIStringEncoding
&& isByteEncoding(internalEncoding))
{
unsigned i;

if (bytes > self->_count)
{
bytes = self->_count;
}
for (i = 0; i < bytes; i++)
{
unsigned char c = self->_contents.c[i];

if (c > 127)
{
[NSException raise: NSCharacterConversionException
format: @"unable to convert to encoding"];
}
buffer[i] = c;
}
buffer[bytes] = '\0';
if (bytes < self->_count)
{
return NO;
}
return YES;
}
...

显然,此代码与您的错误消息不是一对一的。 但是, 我从您的错误重现中注意到这一点:

reason: 'Unable to convert bytes in string 0x10004d430 to_NSCStringEncoding'

嗯,we all know what a C String is ,并且如果您使用了错误的编码方法(例如,在预期 ASCII 的地方使用 Wide,反之亦然),您将最终遇到这个问题。因此:您是否尝试过在您的应用程序中使用不同的 ASCII 和 Wide 数据类型来解决这个问题?

由于这种行为碰巧很常见,这很可能表明它是应用程序沙箱处理的案例。但是,我还找不到这方面的文档。这应该是 sandboxd 明确指出的内容,正如我在问题勘误表中提出的那样。

关于objective-c - 混淆 NSTextStorage 中的编码异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8407530/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com