Tôi có một lớp con NSDocument cho một trình soạn thảo văn bản đơn giản (sử dụng mẫu ứng dụng dựa trên tài liệu mới của Lion, với vài tùy chỉnh) và tôi gặp lỗi lạ khi tải nội dung tệp vào bộ nhớ văn bản.Gỡ rối ngoại lệ mã hóa trong NSTextStorage
Dưới đây là mã của tôi:
- (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];
}
Lỗi xảy ra khi tôi:
- chạy các ứng dụng trong Xcode (như là một debug xây dựng)
- mở bất kỳ tài liệu
- bỏ ứng dụng (không đóng tài liệu)
- chạy lại ứng dụng từ Xcode
Lỗi treo trong -replaceCharactersInRange:withString:
với "Không thể chuyển đổi byte thành chuỗi 0x10004d430 thành _NSCStringEncoding".
Nhưng nó chỉ xảy ra trên tất cả các thứ hai ra mắt của ứng dụng (một mắt thứ ba sẽ không sụp đổ, và nó sẽ tự động mở lại các tài liệu nó đã bị rơi cố gắng mở thời gian trước đó). Nó cũng chỉ xảy ra khi tôi chạy ứng dụng từ Xcode. Bản phát hành bản phát hành chưa bao giờ gặp sự cố khi khởi chạy.
Tôi nghĩ rằng đó có thể là sự cố mã hóa với hệ thống tự động lưu, nhưng nó thậm chí còn đổ vỡ khi tôi nhận xét mã đó và chỉ tải chuỗi @ "hello world" vào chế độ xem văn bản (như được hiển thị trong mã ở trên) . Tương tự, nhận xét ra NSLog()
không hiển thị bất kỳ điều gì lạ. Lưu trữ văn bản hợp lệ (được tải từ tệp xib), độ dài lưu trữ văn bản là 0 và textContent là nội dung của tệp đang được mở.
--- EDIT ---
Tôi đã học được vấn đề này có liên quan trong một số cách để các com.apple.security.app-sandbox
hưởng. Nếu quyền lợi/hộp cát được kích hoạt thì ứng dụng của tôi không bị lỗi. Nếu một trong hai quyền lợi hoặc tính năng ứng dụng-sandbox là bị tắt thì ứng dụng của tôi sẽ gặp sự cố vào mỗi lần khởi chạy thứ hai cố gắng khôi phục tài liệu đã mở trước đó.
Tôi chỉ nhận thấy nó bị lỗi khi thực hiện xây dựng/chạy từ bên trong xcode, bởi vì đó là cấu hình xây dựng duy nhất của tôi với hộp cát bị tắt.
---/EDIT ---
Có ai có bất kỳ ý tưởng? Trường hợp ngoại lệ đầy đủ sau, và mã nguồn đầy đủ là trên 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
)
Bạn * có thể * có tham nhũng bộ nhớ. Bạn đã thử chạy các công cụ nhất quán bộ nhớ có sẵn trong XCode chưa? (Xây dựng và phân tích, Zombies, và ilk) – voidref
Có, tôi đã thử xây dựng và phân tích, và zombie được kích hoạt. Tôi cũng đang sử dụng ARC. –
Tôi đã đi và nhận dự án của bạn bởi vì nó là hấp dẫn. Tôi kích hoạt bảo vệ scribble và tất cả những điều đó, vẫn không có gì nhìn sai. Có một số mối quan tâm hợp lệ mà Trình phân tích hiển thị, nhưng việc sửa chúng không ảnh hưởng đến vấn đề này. – voidref