그래서 어떤 경우에는 특정 상황에서 개체를 삭제하는 것과 관련된 누수가 있습니다.배열 및 참조 포인터에서 제거한 후 해제
전제 : - Tree 개체의 NSMutableArray가 있습니다 (Tree 개체 자체를 그리는 방법을 알고 있습니다). - 내가 참조한 포인터 (Tree *가 선택됨)는 기본적으로 어떤 트리를 마지막으로 가리켰는지 가리 킵니다. - * 선택된 포인터는 약한 참조입니다.
좋아요, 지금까지 그렇게 좋았습니다.
문제점 : 트리를 삭제하면 누출이 발생합니다. 목록에서 삭제 된 트리가 배열에서 제거되기 전에 모든 것을 내부적으로 해제한다는 것을 확인합니다 (배열에서 제거하면 자동으로 해당 트리를 호출해야합니다).
내가 뭘하려 : 내 트리 * 선택 포인터가 자기 속성을 통해 터치 된 나무가 할당되는 것으로 나타났습니다 :
self.selected = 나무;
...이 작업을 수행하면 그 결과가 그대로 유지됩니다. 그래서 내가하려고 한 것은 전화였습니다.
[self.selected release];
트리를 배열에서 제거한 직후이를 호출했습니다. ... 그러나 어느 시점에서 그것은 본질적으로 그것이 이미 공개되었다는 것을 말합니다.
질문 : 왜이 오류 메시지가 표시됩니까? 나는 배열에서 그것을 제거했지만, self.selected 된 포인터는 여전히 유지 된 수를 가지므로 나는 그것을 풀어서는 안된다.
아마도 제거 프로세스 후에 nil로 설정해야합니까? 아니면 제거 프로세스 전에 자동 릴리스로 설정해야합니까?
질문 수정 : * 선택된 포인터에 배열에있는 객체의 보유 개수가 있으므로 배열에서 해당 객체를 제거하면 할당이 해제되는 이유는 무엇입니까? 사실 내가 그것에 대한 유지 된 참조가 할당 취소되는 것을 방지해야했습니다, 올바른 ??? –
그래서 내가 자기 키워드를 사용하지 않고 * 선택된 포인터를 할당했다. 제거 프로세스를 수행 한 후 참조 포인터에 대한 호출을 호출하지 않거나 nil로 설정하지 마십시오. 지금까지 누출이 없습니다! –
젠장. 누출, 누출, 누출, 그건 돌아 왔어. –