2015-01-04 2 views
1

나는 소프트웨어를 제어하는 ​​응용 프로그램을 만들고 있습니다. 때때로 EXC_BAD_ACCESS 오류가 발생합니다. 프로젝트가 ARC를 사용할 수있는 경우에도 MIDINetworkConnection과 관련 있다고 생각합니다. 연결 번호에 액세스하려하지만 잘못된 메모리 주소로 이동하려고 시도하는 것 같습니다. 누구든지 문제를 발견 할 수 있습니까?MIDINetworkConnection EXC_BAD_ACCESS 오류

- (NSString*) describeConnections { 

    NSMutableArray* connections = [NSMutableArray arrayWithCapacity:[[[MIDINetworkSession  defaultSession] connections] count]]; 
    for (MIDINetworkConnection* connection in [[MIDINetworkSession defaultSession] connections]) { 
     [connections addObject:[[connection host] name]]; 
    } 
    if ([connections count] > 0) { 
     return [connections componentsJoinedByString:@", "]; 
    } 
    else{ 
     return @"(Not connected)"; 

    } 

} 

중단 점 오류 메시지와 함께

NSMutableArray* connections = [NSMutableArray arrayWithCapacity:[[[MIDINetworkSession  defaultSession] connections] count]]; 

에 중지 : 스레드 1 : EXC_BAD_ACCESS (코드 = 1, 주소 = 0x2033b00c)

내가 연결을보고 있어요 디버거 =에서 (NSMutableArray *) 위의 오류와 일치하지 않는 0x839ab1e0. 이것이 문제의 원인이 될 수 있습니까?

이 스레드 스택 트레이스 :

* thread #1: tid = 0x9f2b0, 0x01da9e15 libobjc.A.dylib`objc_retain + 21, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x5302f2fb) 
frame #0: 0x01da9e15 libobjc.A.dylib`objc_retain + 21 
* frame #1: 0x0000d14b Fader`-[MIDIController describeConnections](self=0x7c3c35b0, _cmd=0x00083ee3) + 683 at MIDIController.m:149 
frame #2: 0x00049073 Fader`-[MainViewController internalReloadConnections:](self=0x7d0f6000, _cmd=0x000849f0, sender=0x7d0f6000) + 115 at MainViewController.m:1087 
frame #3: 0x000494e0 Fader`-[MainViewController updateDisplay](self=0x7d0f6000, _cmd=0x000847c9) + 272 at MainViewController.m:1143 
frame #4: 0x014e2119 Foundation`__NSFireTimer + 97 
frame #5: 0x020bf8d6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 
frame #6: 0x020bf25d CoreFoundation`__CFRunLoopDoTimer + 1309 
frame #7: 0x0207e6ba CoreFoundation`__CFRunLoopRun + 2090 
frame #8: 0x0207dbcb CoreFoundation`CFRunLoopRunSpecific + 443 
frame #9: 0x0207d9fb CoreFoundation`CFRunLoopRunInMode + 123 
frame #10: 0x038d324f GraphicsServices`GSEventRunModal + 192 
frame #11: 0x038d308c GraphicsServices`GSEventRun + 104 
frame #12: 0x002b58b6 UIKit`UIApplicationMain + 1526 
frame #13: 0x0000b06c Fader`main(argc=1, argv=0xbfff63f0) + 76 at main.m:14 
frame #14: 0x02a6bac9 libdyld.dylib`start + 1 
+0

디버그 콘솔의 모든 메시지가 중단 점 때 열거하는 것이 좋습니다? (또는 중단 점을 해제 한 경우) –

+0

콘솔에 메시지가 없습니다 (lldb). – Youngin

+0

(lldb) 프롬프트에서 'bt'를 입력하면 스택 추적을 얻을 수 있습니다. 단서가있을 수 있습니다. –

답변

2

아마도 [[MIDINetworkSession defaultSession] 연결] 당신이 그것을 열거하는 동안 컬렉션 변경되고? (미디 연결이 끊어 지거나 빠져 나옴)

변경 가능한 컬렉션, 특히 소유하지 않은 컬렉션을 빠르게 열거하는 것은 현명하지 않습니다. 나는 시작에서있는 NSArray로 복사하는 대신

- (NSString*) describeConnections { 

     // NSArray *tempConnections = [NSArray arrayWithArray: [[MIDINetworkSession defaultSession] connections] ]; 
     //edit. replaced with line below, we are working with a set, not an array, see comments below.. 
     NSArray *tempConnections = [[[MIDINetworkSession defaultSession] connections]allItems]; 

     NSMutableArray* connections = [NSMutableArray arrayWithCapacity:[tempConnections count]]; 
     for (MIDINetworkConnection* connection in tempConnections) { 
      [connections addObject:[[connection host] name]]; 
     } 
     if ([connections count] > 0) { 
      return [connections componentsJoinedByString:@", "]; 
     } 
     else{ 
      return @"(Not connected)"; 

     } 

    } 
+1

안녕하세요 @ Jef 답장을 보내 주셔서 감사합니다. 당신은 아마도 이것에 대해 정확합니다. 내가 제공 한 코드 예제를 사용하려고하면 "NSSelect *를 'NSArray *'유형의 매개 변수로 보내는 호환되지 않는 포인터 유형이 발생합니다. 이유는 무엇입니까? – Youngin

+0

[NSINetworkSession defaultSession] 연결은 NSSet 또는 NSMutableSet입니다. 어디에 그것을 배열이라고 가정했는지. 첫 번째 줄을 NSArray로 변경해보십시오. * tempConnections = [[[MIDINetworkSession defaultSession] connections] allItems]; – Jef