2010-04-07 3 views
0

이 시나리오를 이해하는 데 약간의 어려움이 있습니다.iPhone 메모리 관리에 대한 모호한 시나리오

  • 나는
  • 내가 뭔가의 유지 속성을 설정 객체를 생성
  • 내가
  • 내가 객체를 해제의 속성을 해제하는 것을 잊지
  • 내가 재산을 공개하지 않았다으로

dealloc 메서드에서 시나리오가 메모리 누수를 초래하거나 속성이 자동으로 해제됩니까?

답변

-1

예, 누수입니다.

유지, alloc은 카운터를 1 늘립니다. 릴리스가 카운터를 감소시킵니다. 카운터가 0에 도달하면 메모리가 해제됩니다. 이 같은 세터

생각해

[newvalue retain]; 
[property release]; 
property = newvalue; 

그래서 ..

  • 객체 => 0 + 1 = 1
  • 일부 객체에 할당 만드는 특성을 보유 => 1 + 1 = 2
  • 해제 대상 => 2-1 = 1

언젠가 다시 그 물건을 놓아야 할 것입니다. 그리고 autorelease이 아이폰 환경에서 잘 작동하지 않는다고 믿으십시오.

+1

이것은 잘못된 것이며 autorelease가 실제로 iPhone에서 작동합니다. – Ken

+0

작은 수의 자동 회수 객체는 괜찮습니다. 그러나, 나는 아직도 당신이 그것을 사용하지 말 것을 제안합니다. dealloc func 에서 속성을 해제 할 수 있습니다. '[nil release]'는 문제가 전혀 발생하지 않기 때문입니다. – Bird

0

코코아의 작동 방식은 항상 메모리 관리가 로컬로처럼 보입니다. 이것은 일종의 요점입니다. 당신은 한 가지 방법 만보고 방법에 누수 또는 오류가 있는지 여부를 알 수 있어야합니다. 글로벌 프로그램 지식이 필요하지 않습니다.

-copy, -alloc, -retain 또는 -new 메소드에서 오브젝트를 수신 한 경우 오브젝트를 해제해야하는 것은 사용자의 책임입니다. 이렇게하면

:

[obj setProp:foo]; 

그것은 foo를 해제하는 것은 귀하의 책임입니다? 아니오 - 규칙을보십시오. obj가 그것을 유지한다면 (그리고 그것이 당신이 그것을한다는 것을 알게된다고 말하는 것입니다), oball이 그것을 해제하는 것은, dealloc 메소드에서 더 빨리 종료해야하는 책임입니다.

이렇게하면 어떤 종류의 자산이든간에 균형을 유지하게됩니다. -prop.

id obj = [[MyObject alloc] init]; 
[obj setProp:foo]; 
[obj release]; 

* init, copy, dealloc 및 접근 자 메서드의 구현 내를 제외합니다.

관련 문제