2011-01-20 7 views
2

안녕하세요, 다음 코드를NSInvocationOperation을 해제하면 앱이 충돌합니다.

NSString *analyticsStr = [[NSString alloc] initWithString:[self constructXMLMessage:TagObj]]; 
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
                     selector:@selector(sendAnalyticsString:) 
                      object:analyticsStr]; 
[operationQueue addOperation:operation]; 
[analyticsStr release]; 
//[operation release]; 

내가 [작업 릴리스] 내 주석을 제거 할 때 내 응용 프로그램이 충돌합니다. 이 오류가 발생합니다 :

malloc : * 개체에 대한 오류 0x726ed50 : 해제 된 포인터가 에 할당되지 않았습니다. * malloc_error_break에서 중단 점을 설정하여

를 디버깅합니다.

NSOperationQueue 물체의 보살핌. 내가 잘못하고 있거나 무언가를 알고 있습니다.

+2

작업을 유지하므로 다른 문제가 있습니다. 객체가 완성되면 무엇을합니까? 아무것도? –

+0

네, 맞습니다. 아마도 다른 곳에서는 문제가있을 것입니다 .... –

답변

3

인스 트루먼 트의 좀비 템플릿을 사용하여이를 디버깅하십시오. 할당 취소 된 후에 개체에 메시지를 보내면 플래그가 타임 라인에 표시됩니다. 해당 플래그의 단추를 클릭하여 개체를 부당하게 해제 한 조사를 시작할 수 있습니다.

그런데 문자열 개체를 만들 필요가 없습니다. constructXMLMessage:이 반환하는 문자열은 현재 자동 실행 풀이 끝날 때까지 지속됩니다.이 풀은 항상 작업해야합니다. 갑자기 당신에게서 죽지 않을 것입니다.

+0

re : "'constructXMLMessage :'가 반환하는 문자열은 현재 자동 풀링 풀이 끝날 때까지 계속됩니다. "- NSInvocationOperation에 전달할만큼 길게 지속된다는 것을 의미합니다. 그러면 NSInvocationOperation을 유지할 것입니다. 그렇습니까? 작업에 보존 된 버전이 사용 되더라도 작업이 실행될 때까지 (현재) 자동 복구 풀이 사라 졌을 수 있습니다. – Richard

+0

좋은 지적; 나는 그것을 놓쳤다. 예, NSInvocationOperation의 문서에서는 지정된 초기화 프로그램이 호출에 인수를 유지하도록 알려주기 때문에 풀이 종료 된 후에도 작업이 완료 될 때까지 문자열이 안전해야합니다. –

관련 문제