2009-08-08 7 views
1

그래서 어떤 경우에는 특정 상황에서 개체를 삭제하는 것과 관련된 누수가 있습니다.배열 및 참조 포인터에서 제거한 후 해제

전제 : - Tree 개체의 NSMutableArray가 있습니다 (Tree 개체 자체를 그리는 방법을 알고 있습니다). - 내가 참조한 포인터 (Tree *가 선택됨)는 기본적으로 어떤 트리를 마지막으로 가리켰는지 가리 킵니다. - * 선택된 포인터는 약한 참조입니다.

좋아요, 지금까지 그렇게 좋았습니다.

문제점 : 트리를 삭제하면 누출이 발생합니다. 목록에서 삭제 된 트리가 배열에서 제거되기 전에 모든 것을 내부적으로 해제한다는 것을 확인합니다 (배열에서 제거하면 자동으로 해당 트리를 호출해야합니다).

내가 뭘하려 : 내 트리 * 선택 포인터가 자기 속성을 통해 터치 된 나무가 할당되는 것으로 나타났습니다 :

self.selected = 나무;

...이 작업을 수행하면 그 결과가 그대로 유지됩니다. 그래서 내가하려고 한 것은 전화였습니다.

[self.selected release];

트리를 배열에서 제거한 직후이를 호출했습니다. ... 그러나 어느 시점에서 그것은 본질적으로 그것이 이미 공개되었다는 것을 말합니다.

질문 : 왜이 오류 메시지가 표시됩니까? 나는 배열에서 그것을 제거했지만, self.selected 된 포인터는 여전히 유지 된 수를 가지므로 나는 그것을 풀어서는 안된다.

아마도 제거 프로세스 후에 nil로 설정해야합니까? 아니면 제거 프로세스 전에 자동 릴리스로 설정해야합니까?

+0

질문 수정 : * 선택된 포인터에 배열에있는 객체의 보유 개수가 있으므로 배열에서 해당 객체를 제거하면 할당이 해제되는 이유는 무엇입니까? 사실 내가 그것에 대한 유지 된 참조가 할당 취소되는 것을 방지해야했습니다, 올바른 ??? –

+0

그래서 내가 자기 키워드를 사용하지 않고 * 선택된 포인터를 할당했다. 제거 프로세스를 수행 한 후 참조 포인터에 대한 호출을 호출하지 않거나 nil로 설정하지 마십시오. 지금까지 누출이 없습니다! –

+0

젠장. 누출, 누출, 누출, 그건 돌아 왔어. –

답변

0

무슨 일이 벌어지고있는 건데 selected은 할당되지 않은 객체를 가리키며 아무 것도 아닙니다.

내가 명시 적으로 해제하는 대신

self.selected = nil; 

을 시도 할 것입니다. 보유 수를 처리해야합니다.

1

selected 인스턴스 변수의 유지/해제를 미세 조정하려고 시도하지 마십시오. 당신이 selected이 약한 참조가 될하려면 assign 속성을 선언 :

@property(nonatomic, assign) Tree *selected; 

당신이 그것을에 값을 할당 할 때이 유지되지 않습니다 그런 식으로. 개념적으로는 NSMutableArray이 유지하는 참조를 "피기 백"합니다.당신이있는 NSMutableArray에서 뭔가를 제거 할 때, 조금 이런 식으로 작업을 수행합니다

if (self.selected == toBeRemoved) 
    self.selected = nil; 
[myArray removeObject:toBeRemoved]; 

명시 적으로 assign을 지정하지 않았고, 당신의 재산은 그 내용을 유지하는 경우, 당신이 가장 가능성이 예외를지고 있었다 다음 과제 때문에 ~ self.selected에 요소를 제거한 후 메시지에 의해 이미 릴리스 된 이전 값으로 다른 -release 메시지가 전송되도록했습니다.

0

기본적으로 내 약한 참조는 'self'를 사용하여 할당되므로 내부적으로 retain이 호출됩니다. 나는 '자아'를 제거했고, 이제는 상황이 훌륭하고 훌륭합니다. :) 감사합니다!

관련 문제