2009-03-13 11 views
0

개체가 메모리에서 해제되었는지 확인하는 방법은 무엇입니까?iphone 메모리 관리 문제

우리는 객체를 생성하기 위해 alloc | copy | retain을 사용할 때 수동으로 객체를 릴리즈해야한다는 것을 알고 있습니다. 인스턴스 클래스 메서드 (NSString stringwithformat:)를 사용하는 경우 객체는 NSAutoRealeasePool에 의해 자동으로 해제되지만 일부 객체는 거기에서 (void)dealloc 함수를 해제하는 데 사용됩니다.

는 사람 개체를 해제 나에게

  1. (void)dealloc에서 즉시 ALLOC 기능 후 [object release]의 차이점은 무엇

    , [object release]NSAutoReleasePool를 말할 수 있습니까?

  2. (void)dealloc 함수가 호출되는시기와 NSAutoReleasePool이 메모리를 릴리스하는시기는 모든 루프주기입니다. 코드에서 어떻게 확인할 수 있습니까?

  3. 헤더에서 변수를 선언하고 retain으로 속성을 설정할 때 메모리 누수가 발생하지 않지만 해당 개체에 alloc 함수를 여전히 사용할 수 있지만 this post 헤더에서 retain 개체가 선언 된 것처럼 보입니다. 두 객체 모두 객체를 유지할 것이기 때문에 더 이상 객체를 할당 할 수 없으며 아무도 내가 왜 메모리 누수없이이 코드를 작성할 수 있는지 말해 줄 수 있습니까?

+0

retag : "memory"& "management"to "memory-management" – Jeremiah

+0

이것은 실제로이 형식으로는 잘 대답 할 수없는 질문입니다.Objective-C 프로그래밍에 대한 좋은 책을 얻어 연구해야합니다. (또는 메모리 관리를 포기하고 ARC를 계속 사용하십시오.) –

답변

4
  1. [object release] 출시 개체 즉시. 해제 메시지를 보낸 후에는 개체를 다시 사용하지 않아야합니다. 너의 것이 마지막 보유이면 풀어 놓을 때 기억은 풀어 질 수 있었다. Autorelease는 '나중에'객체를 해제합니다. 시스템은 현재 메시지의 범위를 벗어나는 것보다 '나중에'의 의미에 대해 아무것도 보장하지 않습니다.

  2. 위 참조하면, 코드의 관점에서 보면 autorelease 다음에 dealloc이 호출 될 때를 보장 할 실제적인 진리는 없습니다. autorelease 메시지를 보내는 메소드를 반환 한 후 언젠가는 추측해야합니다.

  3. 단순히 유지 및 해제 균형을 유지해야합니다. 당신이 하나에서 여러개를 가지고 있다면 (당신이 묘사하는 상황이 그렇듯이) 그것이 누수입니다. 반대로 불균형이 다른 경우에는 해제 된 메모리에 액세스 할 때 더 파괴적인 오류가 발생합니다.

잔류 속성에 대한 올바른 순서이다 :

  1. alloc init // retain == 1

  2. set the property // retain == 2 due to setProperty calling retain.

  3. release the object // retain == 1

,617,

보유 회수를 1로 남겨 둡니다. 메모리 누출은 없습니다.

+0

# 1을 수정하여 "개체를 다시 사용하면 안됩니다." 객체를 놓은 후에는 객체를 다시 사용하지 않아야합니다. 당신은 다른 것을 가지고 있다는 것을 "안다"고 할지도 모르지만, 다른 곳으로 쉽게 릴리즈 콜을 옮길 수있을 때 코드가 혼란 스럽다. – Alex

+0

일반적으로 사실이지만 많은 경우 약한 참조를 유지하는 것이 허용 가능하다고 생각합니다. 이 능력이 없다면, 당신은 서로를 유지하고 누출되는 두 개의 물체로 끝날 수 있습니다. 어림짐작으로서, 당신 말이 맞습니다. –

+0

... 또는 두 개의 보유 및 릴리스 중 하나를 보유하지만 여전히 보유하고있는 경우. –