2011-09-03 40 views
2

我有一個簡單的文檔應用程序,基於文檔模板,當「恢復保存 - >上次打開時引發異常版本「菜單項在Mac OS X 10.7上被選中。簡單的文檔應用程序,在Mac OS X 10.7中引發「恢復保存」異常Lion

這個異常不在我的代碼中,它在可可裏面。它也似乎與我正在做的任何事情有關。我的應用程序非常簡單(在此階段),基於最新穩定版本的Xcode附帶的模板,幾乎是基於可可文檔的可可基於文本的應用程序。

我意識到這可能是Lion中的一個錯誤,但我需要找到一種解決方法。

查看下面的例外,以及我的NSDocument子類的整個內容(非常小)。

步驟來重現

  • 打開任何文件
  • 類型的單個字符在文本視圖
  • 選擇文件 - >恢復到保存
  • 點擊最後開業版本

異常

2011-09-04 07:10:29.182 myapp[15433:707] *** -[NSPathStore2 stringByAppendingPathExtension:]: nil argument 
2011-09-04 07:10:29.191 myapp[15433:707] (
    0 CoreFoundation      0x00007fff89c2b986 __exceptionPreprocess + 198 
    1 libobjc.A.dylib      0x00007fff90c6ed5e objc_exception_throw + 43 
    2 CoreFoundation      0x00007fff89c2b7ba +[NSException raise:format:arguments:] + 106 
    3 CoreFoundation      0x00007fff89c2b744 +[NSException raise:format:] + 116 
    4 Foundation       0x00007fff86d2b172 -[NSPathStore2 stringByAppendingPathExtension:] + 112 
    5 AppKit        0x00007fff9148f8c3 -[NSDocument _preserveCurrentVersionForReason:error:] + 579 
    6 AppKit        0x00007fff9147655b __-[NSDocument _revertToVersion:preservingFirst:error:]_block_invoke_3 + 99 
    7 Foundation       0x00007fff86ef28c3 __-[NSFileCoordinator coordinateReadingItemAtURL:options:error:byAccessor:]_block_invoke_1 + 113 
    8 Foundation       0x00007fff86ef2f34 -[NSFileCoordinator(NSPrivate) _invokeAccessor:orDont:thenRelinquishAccessClaimForID:] + 202 
    9 Foundation       0x00007fff86d98a28 -[NSFileCoordinator(NSPrivate) _coordinateReadingItemAtURL:options:error:byAccessor:] + 663 
    10 Foundation       0x00007fff86ef284c -[NSFileCoordinator coordinateReadingItemAtURL:options:error:byAccessor:] + 79 
    11 AppKit        0x00007fff91484b41 __-[NSDocument _revertToVersion:preservingFirst:error:]_block_invoke_1 + 347 
    12 AppKit        0x00007fff914901e3 -[NSDocument performSynchronousFileAccessUsingBlock:] + 42 
    13 AppKit        0x00007fff9148fc90 -[NSDocument _revertToVersion:preservingFirst:error:] + 125 
    14 AppKit        0x00007fff91476cf9 -[NSDocument _revertToDiscardRecentChangesPreservingFirst:error:] + 43 
    15 AppKit        0x00007fff91477094 __-[NSDocument _revertToDiscardRecentChangesThenContinue:]_block_invoke_3 + 164 
    16 AppKit        0x00007fff91474851 __-[NSDocument performSynchronousFileAccessUsingBlock:]_block_invoke_1 + 19 
    17 AppKit        0x00007fff91475bda -[NSDocument continueFileAccessUsingBlock:] + 227 
    18 AppKit        0x00007fff91490413 -[NSDocument _performFileAccessOnMainThread:usingBlock:] + 466 
    19 AppKit        0x00007fff9149023f -[NSDocument performSynchronousFileAccessUsingBlock:] + 134 
    20 AppKit        0x00007fff91495891 __-[NSDocument _revertToDiscardRecentChangesThenContinue:]_block_invoke_2 + 301 
    21 AppKit        0x00007fff914909a9 -[NSDocument _something:wasPresentedWithResult:soContinue:] + 21 
    22 AppKit        0x00007fff91381bee -[NSAlert didEndAlert:returnCode:contextInfo:] + 93 
    23 AppKit        0x00007fff9138e356 -[NSApplication endSheet:returnCode:] + 275 
    24 AppKit        0x00007fff91381ab4 -[NSAlert buttonPressed:] + 265 
    25 CoreFoundation      0x00007fff89c1b11d -[NSObject performSelector:withObject:] + 61 
    26 AppKit        0x00007fff911dd852 -[NSApplication sendAction:to:from:] + 139 
    27 AppKit        0x00007fff911dd784 -[NSControl sendAction:to:] + 88 
    28 AppKit        0x00007fff911dd6af -[NSCell _sendActionFrom:] + 137 
    29 AppKit        0x00007fff911dcb7a -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2014 
    30 AppKit        0x00007fff9125c57c -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 489 
    31 AppKit        0x00007fff911db786 -[NSControl mouseDown:] + 786 
    32 AppKit        0x00007fff911a666e -[NSWindow sendEvent:] + 6280 
    33 AppKit        0x00007fff9113ef19 -[NSApplication sendEvent:] + 5665 
    34 AppKit        0x00007fff910d542b -[NSApplication run] + 548 
    35 AppKit        0x00007fff9135352a NSApplicationMain + 867 
    36 myapp        0x00000001000018d2 main + 34 
    37 myapp        0x00000001000018a4 start + 52 
) 

NSDocument子類

@implementation MyTextDocument 

@synthesize textStorage; 
@synthesize textView; 

+ (BOOL)autosavesInPlace 
{ 
    return YES; 
} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     self.textStorage = nil; 
     self.textView = nil; 

     textContentToLoad = [@"" retain]; 
    } 
    return self; 
} 

- (NSString *)windowNibName 
{ 
    return @"MyTextDocument"; 
} 

- (void)windowControllerDidLoadNib:(NSWindowController *)aController 
{ 
    [super windowControllerDidLoadNib:aController]; 

    self.textStorage = self.textView.textStorage; 
    [self loadTextContentIntoStorage]; 
} 

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    return [self.textStorage.string dataUsingEncoding:NSUTF8StringEncoding]; 
} 

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    textContentToLoad = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    if (!textContentToLoad) { 
    *outError = [NSError errorWithDomain:NSCocoaErrorDomain code:NSFileReadUnknownError userInfo:nil]; 
    return NO; 
    } 

    [self loadTextContentIntoStorage]; 

    return YES; 
} 

- (void)loadTextContentIntoStorage 
{ 
    if (!self.textStorage || !textContentToLoad) 
    return; 

    [self.textStorage beginEditing]; 
    [self.textStorage replaceCharactersInRange:NSMakeRange(0, self.textStorage.length) withString:textContentToLoad]; 

    [textContentToLoad release], textContentToLoad = nil; 
} 

@end 

回答

2

是您的plist中正確設置,當涉及到的類型?

看來,NSDocument將[self fileNameExtensionForType:[self autosavingFileType] saveOperation:NSAutosaveElsewhereOperation]的結果傳遞給stringByAppendingPathExtension:(此處引發異常的方法)。如果您的應用程序針對此表達式返回nil,則可能導致此異常。

您應該爲Apple提交一個bug,但同時請確保您的應用程序返回非nil

+0

就是這樣,謝謝!我認爲我的文檔已正確配置,但我的應用(通用文本編輯器)沒有明確的「正確」擴展名。我重寫了'-fileNameExtensionForType:'在存在時返回'self.fileURL.pathExtension',否則返回'@「txt」'。 –

0

粘貼此爲您的文檔類(例如Document.m):

-(NSString*)fileNameExtensionForType:(NSString *)typeName saveOperation: (NSSaveOperationType)saveOperation 
{ 
    return @"yourAutosaveExtension"; 
} 

之前,像kperryua說,這種方法沒有得到執行,並返回零。