2010-06-01 4 views
1

iPhone 앱의 경우 NSOperationQueue를 사용하여 SQLite 데이터베이스에 대한 액세스를 한 번에 하나의 쿼리로 제한합니다. 나는 NSOperation의 서브 클래스를 생성하고 기본 기능에서 I는 다음과 같습니다NSOperation이 참석자에게 전달 될 때 크래시 발생

- (void)main 
{  
    // ... other code here ... 

    if([_delegate respondsToSelector:@selector(queryCompleted:)]) 
    { 
     [_delegate performSelectorOnMainThread:@selector(queryCompleted:) 
            withObject:self 
           waitUntilDone:NO]; 
    } 
} 

위임을 측면 : 나는 self을 전달하고 그 이유는 대리자가의 ID에 액세스 할 수 있도록하는 것입니다

- (void)queryCompleted:(QueryOperation*)aQueryOperation 
{ 
    // Breakpoint here allows me to explore and see the members of aQueryOperation 

    id results = [aQueryOperation resultSet]; // Crashes here 

    // ... more code here ... 
} 

쿼리 작업 (대리인 당 하나 이상의 요청이 열려있는 경우) 및 쿼리 결과. performSelectorOnMainThread:withObject:waitUntilDone: 설명서에서

는 명확 상태 :

"은이 방법이 상기 수신기 및 선택이 수행 된 후까지 ARG 파라미터를 보유한다."

그러나 대리자 메서드가 인수에 액세스하려고하면 "EXC_BAD_ACCESS"예외가 발생합니다. 왜 그런 생각을 했니?

이상하게도 NSOperation 객체에 대한 충돌 참조 전에 중단 점을 설정하면 디버거에서 객체 인스턴스와 모든 매개 변수 값을 볼 수 있습니다.

+0

필자는 대기열에 추가하는 작업의 로컬 사전을 보관하는 임시 (아마도 영구적 인) 솔루션을 생각해 냈습니다. 그런 다음 대리자 메서드는 참조 대신 연산의 ID를 반환 한 다음 ID를 사용하여 개체에 대한 참조를 로컬 사전에서 검색합니다. 그러나 위의 코드가 작동하지 않는 이유는 아직도 이해할 수 없습니다. NSOperationQueue는 실행 완료 후 NSOperation에서 모든 보유 수를 어떻게 든 제거합니까? – mpiche

+0

어쩌면 위임자의 코드도 게시 할 수 있습니까? 문제의 원인이되는 액세스 방법에 관한 문제 일 수 있습니다. – Alex

+0

대리인 코드를 포함하도록 게시물을 업데이트했습니다. 그것은 꽤 똑 바른 앞으로 다. 이후 메인 스레드에서 작업에 대한 참조를 저장하는 다른 모델로 이동했습니다. 지금까지는 훌륭하게 작동했지만 여전히 위의 방법이 효과가 없었던 이유를 알고 싶습니다. – mpiche

답변

0

waitUntilDone : 매개 변수를 YES로 설정하십시오. NSOperation 자체를 할당 해제 할 수있는 경쟁 조건이있을 수 있습니다.

+0

같은 예외가 발생합니다. – mpiche

+0

이 경우 NSZombieEnabled를 설정하여 실행해야한다고 생각합니다. 어딘가에서 뭔가를 넘기는 것처럼 보입니다. – JeremyP

관련 문제