2009-08-18 3 views
1

서버를 처음 실행할 때 초기화 할 일부 통신을 수행하는 iPhone 응용 프로그램에서 작업하고 있습니다. 각 기본 작업 (사용자 인증, 활성화 키 가져 오기, 업데이트 다운로드 등)을 수행 할 수있는 메소드가있는 ServerCommunication 클래스가 있으며 각 작업에 대해 ServerCommunication의 새 인스턴스가 생성됩니다. 나는 그것들을 재사용하지 않고 있지만 더 효율적 일 것이다."할당 된 인스턴스 0xec75b0에 메시지가 전송되었지만 0xec75b0이 보이지 않아야합니다"

사용자가 첫 번째 초기화 화면을 완료하면 ServerCommunication이 네 번 생성됩니다. 나는 NSLog(@"Initializing ServerCommunication instance %p", self);으로 -init 방법으로 그것을 추적합니다. 두 번째 초기화 화면은 사용자가 "다음"버튼을 누를 때 ServerCommunication을 몇 번 호출하지만 마지막 인스턴스화시 콘솔에 -[ServerCommunication insertDataIntoLocalDB:]: message sent to deallocated instance 0xec75b0 메시지와 함께 응용 프로그램이 중단됩니다. 문제는 0xec75b0이 의 주소이고 첫 번째 화면에서 ServerCommunication 인스턴스의 첫 번째 인스턴스입니다.

왜 그 인스턴스로 메시지를 보내겠습니까? 나는 그 (것)들을 어디에서든지 유지하고 있지 않다; 대부분 autoreleased입니다. 도움이된다면 NSURLConnection을 사용하여 XML 데이터의 비동기 다운로드를 수행 한 다음 NSXMLParser로 파싱합니다. 그런 다음 파서의 대리자 메서드 -(void)parserDidEndDocument:(NSXMLParser *)parser은 내보기 컨트롤러의 메서드에서받은 NSNotifications를 보냄으로써 다음 화면으로 진행할지 아니면 거기에 머물러 있는지 여부를 알 수 있도록 오류 메시지를 표시합니다.

도움을 많이 받으실 수 있습니다!

답변

2

먼저 할 일은 NSZombies를 켜는 것입니다. NSZombies를 켜면 좀비가 메시지를 보내는 시점에서 휴식을 취할 수 있습니다.

이와 같이 문제가 발생하는 일반적인 원인은 약한 참조가있는 개체가 동시에 할당 및 할당 해제되지 않은 경우입니다. 그래서 (가상으로) 다른 객체는 ServerCommunication 객체에 대한 포인터를 대리자 또는 소유자로 저장합니다. ServerCommunication이 할당 해제되면 등록을 취소하지 않고 약한 참조를 보유한 객체가 메시지를 보내려고 시도합니다.

만약 내가 완전히 추측해야만한다면 (물론 그렇습니다!) 나는 ServerCommunication 객체를 NSNotification 옵저버로 추가 하겠지만 결코 제거하지 않을 것입니다. 이 작업을 수행했는지 확인하십시오.

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

해제하기 전에 언젠가. (여기에 NSNotification과 관련된 더 많은 경로가있을 수도 있습니다 - ServerCommunication 객체에 대한 포인터가 뷰 컨트롤러에 데이터로 전달되어 메시지를 보내려고합니다.)

+0

맞습니다! 내 ServerCommunication 인스턴스를 'removeObserver'해야했습니다. 대부분의 알림은 다른 곳에서 수신되지만 ServerCommunication은 사용자가 두 번째 화면에서 "다음"을 탭하면 게시됩니다. 그리고 이전의 모든 인스턴스가 (심지어 아무 것도하지 않았을지라도) 그것을 받기 위해 등록 되었기 때문에 두 번째 화면의 마지막에 알림이 최종적으로 전송되었을 때 NSNotificationCenter가 모든 정보를 NSNotificationCenter로 보내려고했습니다. 이전 인스턴스 (더 이상 존재하지 않음). 감사합니다. –

+0

이것은 내 충돌 문제를 해결했습니다! – lnguyen55

관련 문제