Yosemite:NSSavePanel:__ NSArrayI objectAtIndex:]:索引0超出空数组的边界

时间:2014-10-24 07:56:29

标签: objective-c xcode macos cocoa osx-yosemite

升级到Yosemite之后,当我在我的应用程序中运行NSSavePanel时,我遇到了一个非常奇怪的崩溃。例如,我选择openDocument:它崩溃了。或者我打开面板浏览文件然后崩溃。

An uncaught exception was raised
2014-10-24 09:51:28.429 MyApp[2240:374020] *** -[__NSArrayI objectAtIndex:]: index 0 beyond bounds for empty array
2014-10-24 09:51:28.431 MyApp[2240:374020] (
    0   CoreFoundation                      0x97c59343 __raiseError + 195
    1   libobjc.A.dylib                     0x973bea2a objc_exception_throw + 276
    2   CoreFoundation                      0x97b1cf8c -[__NSArrayI objectAtIndex:] + 204
    3   MyApp                               0x0013c830 -[NSArray(CocoaDevUsersAdditions) firstObject] + 41
    4   AppKit                              0x94567f16 _NSAccessibilityEntryPointValueForAttribute + 2116
    5   AppKit                              0x9456829e NSAccessibilityEntryPointValueForAttribute + 24
    6   AppKit                              0x9435ff4c ValueOfAttributeWithDefault + 80
    7   AppKit                              0x94090fa2 NSAccessibilityChildren + 47
    8   AppKit                              0x94090f48 NSAccessibilityUnignoredChildrenForOnlyChild + 99
    9   AppKit                              0x94090e50 NSAccessibilityUnignoredDescendant + 42
    10  AppKit                              0x94213a51 -[NSNibAXRelationshipConnector establishConnection] + 130
    11  AppKit                              0x9453e342 -[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 1061
    12  AppKit                              0x93ffaad7 -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 56
    13  AppKit                              0x945debdd -[NSNib _instantiateNibWithExternalNameTable:options:] + 735
    14  AppKit                              0x941a3f77 -[NSNib instantiateNibWithOwner:topLevelObjects:] + 277
    15  AppKit                              0x94651cee -[NSSavePanel(NSSavePanelLayout) _initContentView] + 189
    16  AppKit                              0x9463d317 -[NSSavePanel initWithContentRect:styleMask:backing:defer:] + 645
    17  AppKit                              0x9463c6db +[NSSavePanel _crunchyRawUnbonedPanel] + 216
    18  AppKit                              0x945e978a +[NSOpenPanel openPanel] + 33
    19  AppKit                              0x944b66fb -[NSDocumentController _setupOpenPanel] + 42
    20  AppKit                              0x944b6b62 -[NSDocumentController beginOpenPanelWithCompletionHandler:] + 96
    21  AppKit                              0x944b6630 -[NSDocumentController openDocument:] + 413
    22  libobjc.A.dylib                     0x973bc853 -[NSObject performSelector:withObject:] + 70
    23  AppKit                              0x94380328 __36-[NSApplication sendAction:to:from:]_block_invoke + 51
    24  libsystem_trace.dylib               0x9096dc03 _os_activity_initiate + 89
    25  AppKit                              0x941f3a11 -[NSApplication sendAction:to:from:] + 548
    26  AppKit                              0x9420f9ed -[NSMenuItem _corePerformAction] + 479
    27  AppKit                              0x9420f6c9 -[NSCarbonMenuImpl performActionWithHighlightingForItemAtIndex:] + 162
    28  AppKit                              0x9420ed54 -[NSMenu _performActionWithHighlightingForItemAtIndex:sendAccessibilityNotification:] + 79
    29  AppKit                              0x94585872 __38-[NSMenu performActionForItemAtIndex:]_block_invoke + 52
    30  libsystem_trace.dylib               0x9096dc03 _os_activity_initiate + 89
    31  AppKit                              0x94260736 -[NSMenu performActionForItemAtIndex:] + 141
    32  AppKit                              0x9426069e -[NSMenu _internalPerformActionForItemAtIndex:] + 45
    33  AppKit                              0x94260669 -[NSMenuItem _internalPerformActionThroughMenuIfPossible] + 106
    34  AppKit                              0x942604c1 -[NSCarbonMenuImpl _carbonCommandProcessEvent:handlerCallRef:] + 120
    35  AppKit                              0x94204487 NSSLMMenuEventHandler + 679
    36  HIToolbox                           0x905a45d4 _Z22_InvokeEventHandlerUPPP25OpaqueEventHandlerCallRefP14OpaqueEventRefPvPFlS0_S2_S3_E + 36
    37  HIToolbox                           0x903ee501 _ZL23DispatchEventToHandlersP14EventTargetRecP14OpaqueEventRefP14HandlerCallRec + 2291
    38  HIToolbox                           0x903ed4dc _ZL30SendEventToEventTargetInternalP14OpaqueEventRefP20OpaqueEventTargetRefP14HandlerCallRec + 402
    39  HIToolbox                           0x90400d25 SendEventToEventTarget + 88
    40  HIToolbox                           0x905a4452 _ZL18SendHICommandEventmPK9HICommandmmhPKvP20OpaqueEventTargetRefS5_PP14OpaqueEventRef + 447
    41  HIToolbox                           0x904650cc SendMenuCommandWithContextAndModifiers + 72
    42  HIToolbox                           0x90465074 SendMenuItemSelectedEvent + 207
    43  HIToolbox                           0x90464f38 _ZL19FinishMenuSelectionP13SelectionDataP10MenuResultS2_ + 145
    44  HIToolbox                           0x905fb902 _ZL14MenuSelectCoreP8MenuData5PointdmPP13OpaqueMenuRefPt + 775
    45  HIToolbox                           0x9046c266 _HandleMenuSelection2 + 512
    46  HIToolbox                           0x9046c050 _HandleMenuSelection + 55
    47  AppKit                              0x94182f3b _NSHandleCarbonMenuEvent + 359
    48  AppKit                              0x9400e321 _DPSNextEvent + 1702
    49  AppKit                              0x9400d7a1 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 186
    50  AppKit                              0x93ffff6c -[NSApplication run] + 907
    51  AppKit                              0x93fe94d0 NSApplicationMain + 2082
    52  MyApp                               0x00003215 start + 53

1 个答案:

答案 0 :(得分:3)

这是您正在使用的扩展程序类的错误。 NSArray+CocoaDevUsersAdditions firstObject方法实施错误。您发布的崩溃日志的相关部分包括以下三行:

1   libobjc.A.dylib                     0x973bea2a objc_exception_throw + 276
2   CoreFoundation                      0x97b1cf8c -[__NSArrayI objectAtIndex:] + 204
3   MyApp                               0x0013c830 -[NSArray(CocoaDevUsersAdditions) firstObject] + 41

当您尝试访问不包含对象的数组的索引0时,会发生index 0 beyond bounds for empty array错误。 我发现一些代码我认为与this URL

上的NSArray+CocoaDevUsersAdditions类匹配
-(id)firstObject
{
    return [self objectAtIndex:0];
}

上面的代码错了。它应该首先检查对象的数量。正确的代码应如下所示:

-(id)firstObject
{
    id result = nil;
    if (self.count > 0) {
        result = [self objectAtIndex:0];
    }
    return result;
}

所以问题是您使用的NSArray扩展程序实现错误。

最佳解决方案:移除您的NSArray+CocoaDevUsersAdditions类别,并使用firstObject上的公开NSArray方法