2011-12-06 28 views
20

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 
) 
+0

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

+0

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. –

+0

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

Trả lời

0

Dường như đây là lỗi trong OS X 10.7 (Sư tử). Với không thay đổi mã của tôi, sự cố không còn xảy ra trên OS X 10.8 (Mountain Lion) tuân thủ Xcode 4.4.1.

+0

Tôi gặp vấn đề này với một trong các dự án của tôi trong Xcode 5.0.2 trên OS X 10.9.1. Tôi tò mò muốn biết nếu nó bao giờ nổi lên cho bạn? –

+0

@CharlesA. Nó đã không nổi lên đối với tôi, nhưng có lẽ có nhiều cách khác để kích hoạt cùng một triệu chứng. –

5

Tôi thừa nhận, câu hỏi này bối rối tôi cho một thời gian. Tôi nghĩ rằng cuối cùng tôi đã tìm thấy một repro, mặc dù.

Nhìn qua các GNUstepcode that emulates this behavior, tôi thấy mã nguồn sau đây:

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; 
    } 
... 

Rõ ràng, mã này không phải là one-to-one với thông báo lỗi của bạn. Tuy nhiên, Tôi lưu ý này từ repro lỗi của bạn:

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

Vâng, we all know what a C String is, và nếu bạn sử dụng phương pháp mã hóa sai (ví dụ, Wide nơi ASCII dự kiến ​​hoặc ngược lại), bạn sẽ kết thúc với chính xác vấn đề này. Do đó: bạn đã thử các loại dữ liệu ASCII và Wide khác nhau trong ứng dụng của mình để khắc phục vấn đề này chưa?

Do hành vi này thường xảy ra như thế nào, rất có thể cho biết đó là trường hợp được xử lý bởi hộp cát ứng dụng. Tuy nhiên, tôi chưa thể tìm thấy tài liệu cho hiệu ứng này. Điều này cần được ghi rõ một cách rõ ràng bởi sandboxd, như tôi đã nêu ra trong câu hỏi errata.

+1

Vâng, Abhi chưa trả lời về việc liệu điều này có dẫn đến vấn đề này hay không, nhưng tiền thưởng của tôi sắp hết hạn, và câu trả lời của bạn cũng được suy nghĩ và ít hữu ích nhất, vì vậy tôi sẽ trao cho bạn tiền thưởng. –

+0

Cảm ơn sự giúp đỡ, tôi sẽ xem xét nó khi tôi có một phút rảnh rỗi. Mặc dù không phải là một sự lạc quan khủng khiếp, bởi vì sự cố thậm chí xảy ra khi tôi chèn một chuỗi ký tự @ "hello world" cứng vào trong trường, không chỉ khi tôi đọc một chuỗi từ một tệp.Suy nghĩ tiếp theo của tôi để gỡ lỗi này là ngoại lệ không nói về chuỗi tôi đang chèn * mà là đối tượng chuỗi đã có trong trường văn bản, được thay thế bằng giá trị mới. Ca cao Auto-Save có thể làm một cái gì đó kỳ lạ ở đó? Tôi không có thời gian để thử nghiệm. –

+0

Tôi sẽ được quan tâm để xem những gì nó quay ra được. Tôi backtraced nó về như xa như là tolerably tài liệu, nhưng tôi có thể hình dung ném điều trong Xcode và xem những gì sẽ xảy ra. Tôi hy vọng nó là một vấn đề mã hóa ký tự đơn giản, nhưng _where_ và _why_ là điều quan trọng nhất ở đây. – MrGomez

1

Tôi có cùng ngoại lệ trên 10.9.2.

Unable to convert bytes in string 0x60800026cd40 to _NSCStringEncoding 
(
    0 CoreFoundation      0x00007fff8dec825c __exceptionPreprocess + 172 
    1 libobjc.A.dylib      0x00007fff81de0e75 objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff8dec810c +[NSException raise:format:] + 204 
    3 Foundation       0x00007fff8d94dd2b copyFromStringToStorage + 223 
    4 Foundation       0x00007fff8d94db9e -[NSBigMutableString replaceCharactersInRange:withString:] + 1081 
    5 Foundation       0x00007fff8d94d738 -[NSConcreteMutableAttributedString replaceCharactersInRange:withAttributedString:] + 296 
    6 AppKit        0x00007fff88d7889c -[NSConcreteTextStorage replaceCharactersInRange:withAttributedString:] + 77 
    9 myApp       0x00000001035d3fff myApp + 12287 
    10 CoreFoundation      0x00007fff8de96e0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12 
    11 CoreFoundation      0x00007fff8dd8a82d _CFXNotificationPost + 2893 
    12 Foundation       0x00007fff8d8f8e4a -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 
    13 AppKit        0x00007fff88b99cde -[NSApplication finishLaunching] + 440 
    14 AppKit        0x00007fff88b997f3 -[NSApplication run] + 128 
    15 AppKit        0x00007fff88b84783 NSApplicationMain + 940 
    16 libdyld.dylib      0x00007fff81aa65fd start + 1 
    17 ???         0x0000000000000001 0x0 + 1 
) 

Tôi đang sử dụng NSTextStorage trong applicationWillFinishLaunching. Tôi đã chuyển nó đến applicationDidFinishLaunching và tiền phạt hoạt động của nó.

Các vấn đề liên quan