- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个用于简单文本编辑器的 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];
}
错误发生在我:
它在 -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/
我目前正在 iOS 上开发自定义 NSTextStorage,我需要检测一些主题标签 (#)、提及和 url...此时一切正常,但如果用户尝试从键盘输入表情符号字符不显示,因为我使用的是 Helvet
每个示例都将 NSMutableAttributedString 显示为“后备存储”,用于保存与查看/编辑文本相关的文本和属性。我如何使用替代品,例如 std::string 或数据库中的内容。作为测
我有一个 NSTextStorage 的子类,它给我带来了一些问题。每次我执行以下操作时都会崩溃: 在第一行输入一些文字 按返回移动到下一行 至少输入两个字符 点击退格键 我遇到的错误是Termati
我正在构建一个自定义 NSTextStorage 类来查找和匹配自定义用户输入并在我的应用程序中处理它。所以我遵循了几个教程,最著名的是 objc.io's ,并创建了一个子类并将其 layoutMa
我正在子类化 NSTextStorage 来做一些链接突出显示,我已经阅读了 I can on the topic .一切正常,直到我输入 🏒 表情符号字符。 我的子类: private let i
我有一个 NSTextView 子类作为其 NSTextStorage 委托(delegate)。我正在尝试做两件事: 以某种方式突出显示文本 评估文本,然后将答案附加到 TextView 。 我使用
我正在为 iOS/osx 编写语法 Markdown 。 它是 NSTextStorage 的子类。它在 iOS 中运行良好,但在 OSX 中(将代码 UIColor 转换为 NSColor 并将 U
我有一个 NSTextStorage里面有长文本(比如一本书有 500 页,当前字体在设备上超过 9000 页)。我以这种方式为 textcontainer 分发此文本: let textStorag
我有一个 UITextView,它应该接收从 HTML 收缩的 NSAttributesString。最终结果是带有自定义链接下划线的黑色文本。我快崩溃了。 Terminating app due t
我有一个自定义的 UITextView,它通过定义一个自定义的 NSTextStorage 类来利用 Apple 的 TextKit,但是,当我将我的子类用于自定义 TextView 的文本存储时(如
我正在尝试 iOS 的文本解析器。我有一些粗体、斜体、突出显示等语法。我在 UITextView 中使用 NSTextStorage 实例对其进行了设置,以监视更改并设置正确的属性。如果我用文本预加载
根据文档,我尝试继承 NSTextStorage 并在 TextView 中使用它: /* NSTextStorage is a semi-abstract subclass of NSMutabl
对于 NSTextStorage 对象,我想将其设置为具有来自第三方库的 malloc 存储。 (存储的特殊之处在于它是不可交换的,并且不能被复制。)我能发现的唯一可能的方法可能是 allocWith
我有一个 NSTextStorage 委托(delegate)实现 textStorageDidProcessEditing:。不幸的是,userInfo 不包含有关文本更改的任何详细信息。 如何找出
我尝试将此行移植到 xamarin let textStorage = NSTextStorage(attributedString: self.attributedText!) 但我找不到采用 NS
我尝试将此行移植到 xamarin let textStorage = NSTextStorage(attributedString: self.attributedText!) 但我找不到采用 NS
我正在编写一个使用 UITextView 处理富文本编辑的应用程序。它使用 NSTextStorage 为部分字符串设置新属性。然而,如果用户想要在字符串末尾或字符串中间更改字体或字体大小(换句话说,
为了破解another problem分成更小的部分,我正在尝试设置所有 TextKit 组件。但是,在更改初始化 NSTextStorage 的方式后,我遇到了崩溃。出于测试目的,我已将项目简化为以
我有一个用于简单文本编辑器的 NSDocument 子类(使用 Lion 基于文档的新应用程序模板,几乎没有自定义),我遇到了一个奇怪的错误,将文件内容加载到文本存储中。 这是我的代码: - (voi
如何使用 NSTextStorage 存储 NSTextView 的信息? 最佳答案 参见Assembling the Text System by Hand在 Cocoa Text Architec
我是一名优秀的程序员,十分优秀!