2009-08-18 6 views
1

메모리 경고가 발생하면 NSMutableArray에 저장된 많은 개체를 릴리스합니다.NSArray를 해제 할 때 개체를 nil로 설정합니다.

[_children release]; 

는 또한 (A MEM 경고가 일어난 잠재적 후) 어떤 점에서 객체를 통해 재귀 필요, 그래서 나는 '외설하는 nil-하는 내가 비교를 할 수있는 객체 주위에 아직도 있는지 확인해야 배열을 해제해도 아무 것도 없기 때문에 작동하지 않습니다.

반복 도중 배열을 수정할 수 없기 때문에 배열을 루프 처리 할 수 ​​없습니다. 객체를 1 개씩 제거하고 nil로 설정하면 루프를 수행 할 수 없습니다.

분명히 뭔가 빠져있는 것처럼 느껴집니다. 배열에서 일부 값을 + nil로 해제하려고합니다.

답변

5

미안하지만, 나에게 무의미한 것처럼 보입니다. 객체를 nil로 설정할 수는 없으며 객체에 대한 참조는 nil로만 설정할 수 있지만 다른 참조에는 영향을줍니다.

NSObject * a = [[NSObject alloc] init]; 
NSObject * b = a; 

[a release]; 
a = nil; 

// b is NOT nil! b still points to the memory location where 
// a used to be, which is now not valid anymore and using b 
// for anything may crash your application! 

"a"를 배열에 넣은 다음 다시 배열에서 제거하면 "a"의 보유 수는 1 씩 감소합니다. 어느 것이 든 여전히 0보다 크면 "a"가 해제되지 않거나 0 일 때 해제됩니다. 해제 된 후 참조를로 설정하면 여전히 "a"를 가리키는 다른 변수에 영향을 미치지 않습니다.

NSArray가 "a"에 대한 참조를 배열로 제거한 후 그것을 해제 한 후에도 (참조 수가 0이기 때문에) NSArray가 "a"에 대한 참조를 설정하더라도 여전히 "a"를 가리키는 인스턴스 변수에는 아무런 영향을 미치지 않습니다 ".

나는 당신이 무엇을하려고 노력하고 있는지 확실히 알지 못하지만 확실히 가능하다. 그러나 당신은 완전히 잘못된 길을 가고있다.

+0

설명해 주셔서 감사합니다. 나는 잘못된 트랙에 있었고 해결 방법을 발견했다. 나는 C++ 배경에서 왔으므로 이것은 즉시 명백하지 않습니다. 귀하의 예제에서 나는 b == nil로 가정했을 것입니다. – Sam

+1

당신이 정말로 무엇을하는지 모르겠으므로 더 나은 해결책을 제안 할 수 없습니다. 배열의 객체가 자신의 클래스 인 경우 dealloc 메소드 (보유 카운트가 0에 도달하면 호출 됨)를 오버라이드 할 수 있으며 현재 다른 객체 (예 : 대리자 또는 알림 만 브로드 캐스팅) 다른 객체는 자신에 대한 참조를 무효로 업데이트 할 수 있습니다. – Mecki

+0

C++의 경우에도 객체에 대한 포인터가 있다면 객체 자체가 파괴되었을 때 보유하고있는 주소는 지워지지 않을 것입니다. 포인터가 유효하지 않을 것입니다. 당신은 여전히 ​​할당 된 메모리가 사용 된 곳을 가리키는 참조를 가지고 있습니다 ... –

0

다른 곳에서 배열 요소를 유지하지 않는다고 가정하면 배열에서 개체를 제거하거나 배열 자체를 해제하여 요소를 릴리스 할 수 있습니다. 나는 그것이 당신이해야 할만큼 많이 있다고 생각합니다.

각 객체의 ID가 배열 하고는 어레이에서 제거되거나 어레이가 해제되면 해제 메시지에 추가되기 전에 메시지 유지 수신 : 애플 문서에서

+0

하지만 출시 된 것을 어떻게 알 수 있습니까? 그것이 존재하지 않기 때문에 나는 그것을 쿼리 할 수없고, 매달려있는 포인터를 가지고 떠난다 ... – Sam

+0

애플 API가 그렇게 말하기 때문이다. 배열에서 객체를 제거하거나 배열을 해제하면 배열 객체가 해제됩니다. – teabot

+0

당신은 오해하고 있습니다 - (appleAPISaysThisObjectIsReleasedOrNot()) 런타임에 나는 할 수 없습니다. 어쨌든 해결 방법을 찾았습니다. – Sam