이 시나리오를 이해하는 데 약간의 어려움이 있습니다.iPhone 메모리 관리에 대한 모호한 시나리오
- 나는
- 내가 뭔가의 유지 속성을 설정 객체를 생성
- 내가
- 내가 객체를 해제의 속성을 해제하는 것을 잊지 내가 재산을 공개하지 않았다으로
dealloc 메서드에서 시나리오가 메모리 누수를 초래하거나 속성이 자동으로 해제됩니까?
이 시나리오를 이해하는 데 약간의 어려움이 있습니다.iPhone 메모리 관리에 대한 모호한 시나리오
dealloc 메서드에서 시나리오가 메모리 누수를 초래하거나 속성이 자동으로 해제됩니까?
예, 누수입니다.
유지, alloc은 카운터를 1 늘립니다. 릴리스가 카운터를 감소시킵니다. 카운터가 0에 도달하면 메모리가 해제됩니다. 이 같은 세터
생각해
[newvalue retain];
[property release];
property = newvalue;
그래서 ..
언젠가 다시 그 물건을 놓아야 할 것입니다. 그리고 autorelease
이 아이폰 환경에서 잘 작동하지 않는다고 믿으십시오.
코코아의 작동 방식은 항상 메모리 관리가 로컬로처럼 보입니다. 이것은 일종의 요점입니다. 당신은 한 가지 방법 만보고 방법에 누수 또는 오류가 있는지 여부를 알 수 있어야합니다. 글로벌 프로그램 지식이 필요하지 않습니다.
-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 및 접근 자 메서드의 구현 내를 제외합니다.
이것은 잘못된 것이며 autorelease가 실제로 iPhone에서 작동합니다. – Ken
작은 수의 자동 회수 객체는 괜찮습니다. 그러나, 나는 아직도 당신이 그것을 사용하지 말 것을 제안합니다. dealloc func 에서 속성을 해제 할 수 있습니다. '[nil release]'는 문제가 전혀 발생하지 않기 때문입니다. – Bird