2011-02-07 7 views
0

죄송합니다. 수치심 - 오류가 잘못된 행에 표시되도록 디버그 모드를 실행하지 않았습니다. (- 내가 하나 개의 배열이라고하지만 액세스는 다른이었다 오타) 않는 이유NSMutableArray는 다중 스레드 응용 프로그램에서 SIGABRT를 실행하지만 ... _am_을 @ 동기화했습니다!


디버그 모드, 오른쪽 라인을 보여주는에서 오류가 간단한 -error "는 경계의 외측에 배열에 접근하지 말아"이었다 다른 스레드에서 NSMutableArray를 비울 때 NSMutableArray의 개수에 액세스하면 SIGABRT가 생성됩니까? @synchronized는 이름에서 알 수 있듯이해야한다고 생각 했나요?

NSMutableArray *sourceImageRepArray; 

... 

@synchronized(self) 
{ 
    NSLog(@"singleton 1 %p", self); 
    unsigned long count = sourceImageRepArray.count; //SIGABRT here! 
    ... 

당신이 날 공유 할 얼마나 많은 추가 코드를 몰라 ...이입니다 트리거 코드 그것을 :

@synchronized([Singleton sharedSingleton]) 
{ 
    NSLog(@"singleton 2 %p", [Singleton sharedSingleton]); 
    int i, n; 
    n = [filenames count]; 
    for(i=0; i<n; i++){ 
     ImageRep *item = [[ImageRep alloc] init]; 
     [item setPath:[filenames objectAtIndex:i]]; 
     [[Singleton sharedSingleton].targetImageRepArray insertObject:item atIndex: [targetImageBrowser indexAtLocationOfDroppedItem]]; 
     [item release]; 
     [[Singleton sharedSingleton] removeImageRepFromArray:[Singleton sharedSingleton].sourceImageRepArray withPath:[filenames objectAtIndex:i]]; 
    } 
} 

싱글 1 == 싱글 2 :

2011-02-08 07:22:03.265 Crash[60001:5d03] singleton 1 0x200047680 
2011-02-08 07:22:03.433 Crash[60001:a0f] singleton 2 0x200047680 
  • 왜 동기화되지 않습니까?! 그 밖의 무엇이 계속 될 수 있습니까?

답변

0

죄송합니다 ... 수치심 - 오류가 잘못된 행에 표시되도록 디버그 모드를 실행하지 않았습니다. 디버그 모드에서 올바른 줄을 표시하면 오류가 간단합니다. "범위 밖의 배열에 액세스하지 마십시오."- 오류 (typo - 하나의 배열을 참조했지만 다른 배열을 참조했습니다.)

그래서 내 솔루션 문제는 :

릴리스에서 NSLog 디버깅을 수행하지 마십시오. 잘못된 라인의 오류를 표시 할 수 있습니다. (때로는 멀티 스레드 응용 프로그램에서 발생하는 것 같습니까?)

0

자신과 [Singleton sharedSingleton]이 같은 개체인지 확인 하시겠습니까?

+0

네, 그렇습니다. 싱글 톤 1 == 싱글 톤 2. 편집을 참조하십시오. – Torkel

관련 문제