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 객체에 대한 충돌 참조 전에 중단 점을 설정하면 디버거에서 객체 인스턴스와 모든 매개 변수 값을 볼 수 있습니다.
필자는 대기열에 추가하는 작업의 로컬 사전을 보관하는 임시 (아마도 영구적 인) 솔루션을 생각해 냈습니다. 그런 다음 대리자 메서드는 참조 대신 연산의 ID를 반환 한 다음 ID를 사용하여 개체에 대한 참조를 로컬 사전에서 검색합니다. 그러나 위의 코드가 작동하지 않는 이유는 아직도 이해할 수 없습니다. NSOperationQueue는 실행 완료 후 NSOperation에서 모든 보유 수를 어떻게 든 제거합니까? – mpiche
어쩌면 위임자의 코드도 게시 할 수 있습니까? 문제의 원인이되는 액세스 방법에 관한 문제 일 수 있습니다. – Alex
대리인 코드를 포함하도록 게시물을 업데이트했습니다. 그것은 꽤 똑 바른 앞으로 다. 이후 메인 스레드에서 작업에 대한 참조를 저장하는 다른 모델로 이동했습니다. 지금까지는 훌륭하게 작동했지만 여전히 위의 방법이 효과가 없었던 이유를 알고 싶습니다. – mpiche