2009-08-23 4 views
0

sqlite db의 일부 데이터를 채우는 tableviewcontroller가 있고 각 행에 대해 http 서버에서 파일을 다운로드하고 로컬로 캐시합니다. "detailsview"가 열릴 때만 캐시합니다. 그리고 detailsview는 파일 다운로드가 완료된 후 델리게이트를 통해이 테이블에 응답합니다. 이있는 tableview 자체가 navicontroller 밖으로 튀어됩니다Objective C의 메모리 관리 질문

하지만,., 위임에 대한 호출 세부 사항보기의 setDelegate에서 [유지 _delegate] I라는 EXEC_BAD_ACCESS

에 실패하고 모든 것이 잘 작동하지만 이것이 메모리가 누출 될지 확실하지 않습니다 ...

누구든지 조언을 해줄 수 있습니까?

답변

2

대리인이 조기에 해제 될 예정이며 잘못된 개체에 메시지를 보내면 EXEC_BAD_ACCESS가 호출됩니다. 유지하면 문제가 해결되지만 일반적으로 유지 사이클의 가능성이 있으므로 객체를 대리자로 유지하지 않는 것이 좋습니다. 따라서 구조를 다시 생각해 볼 필요가 있습니다. 뷰가 dealloc 될 때 대리자를 릴리스하는 경우 setDelegate :에서도 대리자를 유지하지 않으면 뷰를 제거해야합니다.

2

일반적으로 대리인은 유지주기를 방지하기 위해 유지되지 않습니다. 델리게이트가 당신 앞에 놓여질 수 있다면, 델리게이트가 끝나기 전에 참조를 지우는 것이 델리게이트의 책임입니다.

그러나 어떤 속성이 "retain"또는 "copy"로 설정되어 있으면 setter에서 해당 속성을 유지/복사하거나 (사용자가 대신 사용할 @synthesized setters를 사용) dealloc에서 해제합니다 새는 것을 피하십시오. 그러나 위에서 말했듯이, 두 객체가 할당 해제되지 않도록주기를 유지할 수 있습니다.

환경 변수 NSZombieEnabled 및 NSAutoreleaseFreedObjectCheckEnabled를 사용하여 일부 메모리 디버깅을 설정하고 어떤 객체가 릴리스되고 있는지 알려주는 지 확인하십시오.