2014-10-24 1 views
0

요세미티로 업그레이드 한 후 내 앱에서 NSSavePanel을 실행할 때 매우 이상한 충돌이 발생합니다. 예를 들어 openDocument :를 선택하면 충돌이 발생합니다. 또는 파일을 찾아보기 위해 패널을 열면 충돌이 발생합니다.요세미티 : NSSavePanel : __NSArrayI objectAtIndex :] : 빈 배열의 경계를 벗어난 인덱스

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

NSArray의 공용 firstObject 방법을 사용 ?? –

답변

3

사용중인 확장 클래스의 버그입니다. NSArray+CocoaDevUsersAdditionsfirstObject 메서드가 잘못 구현되었습니다. 충돌의 관련 부분은 당신이이 세 줄을 게시 로그 : 당신이 어떤 물체가없는 배열의 인덱스 0에 액세스하려고 할 때

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

index 0 beyond bounds for empty array 오류가 발생합니다. 나는 this URL

-(id)firstObject 
{ 
    return [self objectAtIndex:0]; 
} 

위의 코드가 잘못에서 나는 NSArray+CocoaDevUsersAdditions 클래스를 일치 생각하는 몇 가지 코드를 발견했다. 먼저 개체 수를 확인해야합니다. 올바른 코드는 다음과 비슷해야합니다

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

그래서 문제는 잘못 구현되어 사용하고있는 NSArray 확장입니다.

최적의 솔루션 : 당신의 NSArray+CocoaDevUsersAdditions 범주를 제거하고 당신이 버그라고 생각하는 경우가 http://bugreporter.apple.com를 통해 사과에보고해야한다

+0

그냥 "else return nil"을 추가하면 문제가 발생할 것입니다 (전혀 컴파일되지 않은 경우). – gnasher729

+0

감사합니다. @ gnasher729, 코드가 수정되었습니다. – danielbeard

+6

[- \ [NSArray firstObject \]] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/#//apple_ref/occ/instp/NSArray/firstObject) 실제로 이제는 공개 파운데이션 메서드입니다. 이것이 AppKit 코드에서 액세스되는 이유입니다. 카테고리에 의해 재정의되어서는 안됩니다. 카테고리에서 메소드를 삭제하면됩니다. – Darren

관련 문제