2010-07-28 3 views
0

보유 수에 대해 걱정하지 말라고 들었습니다. retainCount에 기반한 조건부 로직을 사용하여 release 또는 retain으로 결정해서는 안되지만 걱정하지 않아도된다는 것을 알고 있습니다. 나는 이것이 어떤면에서 메모리 사용에 해당한다고 생각했다. 예를 들어`retainCount`에 대해 걱정하지 않으시겠습니까? 정말?

, 나는, 나 또한 그들을 통해 반복 할 수 있어야하는 NSArray에 투입 한 UIView의 서브 뷰의 무리가있는 경우 그 더블 개수와의 때문에 메모리 사용을 유지하지 않습니다 신청? 그렇다면 하위보기가 말하면 500 UIControl 인스턴스 인 경우 비용이 많이 드는 또는 사소한 것입니까? 물론 이것은 500 인스턴스가 필요하다고 가정합니다.

답변

6

retainCount은 종종 참조 계산 시스템의 잘못된 구현 정보이므로 걱정하지 않아도됩니다. 당신이 염려해야 할 것은 적절한 객체 소유 정책을 따르는 것입니다.

나는 애플의 문서에서 가끔이 게시 :

중요 :이 방법은 메모리 관리 문제를 디버깅에 어떤 가치가 일반적이다. 프레임 워크 객체의 수는 객체에 대한 참조를 유지하기 위해 유지 되었기 때문에 동시에 자동 릴리즈 풀은 객체에 지연 릴리스 수에 제한이 없으므로이 객체에서 유용한 정보를 얻을 수있는 가능성은 거의 없습니다. 방법.

마지막 질문은 하나의 배열에서 다른 배열로 객체를 추가 할 때 메모리 사용량이 두 배로 늘어나지 않는다는 것입니다. 보유 수는 무언가가 소유권을 주장 할 때 1 씩 증가하는 객체의 부호없는 정수입니다. 그러나 다시 한번, 자신에 신경 쓰지 마십시오.

+0

고마워, 그게 나를 위해 작동합니다. 그리고 내가 알고있는 적절한 객체 소유 정책을 반복하지 않는 것에 대해 두 번이나 감사드립니다. –

1

보유 수는 단지 숫자입니다. 유지 카운트가 제로가되는 오브젝트는 할당이 해제됩니다. 그것과는 별도로, 그것이 한 번 또는 50 번 유지되었는지는 중요하지 않습니다.

+2

개체가 할당되었거나 할당되지 않았다는 것을 말하는 것입니다. 이것이 메모리 풋 프린트 측면에서 차이를 만드는 유일한 것입니까? 여기에서 외삽 법 ... –

+2

@ 야어 : 정확히 그가 말한 것입니다. – JeremyP

+0

감사합니다. @JeremyP +1. –

2

그들이 걱정하지 않는 이유는 retainCount 필드가 종종 매우 오도 할 수 있다는 것입니다. autorelease 풀이 마지막으로 플러시 된 시간이나 객체가 자동으로 리사이징 된 횟수를 알지 못하는 것 외에도 일부 복잡한 내부 구조가 있으며 시스템 구성 요소가 일시적으로 참조 할 수없는 방식으로 참조를 보유 할 수 있습니다. 따라서 retainCount을 공부하기 시작하면 다양한 객체로 시스템의 다른 부분이 무엇을하는지 파악하려고 많은 시간을 할애 할 수 있습니다. 응용 프로그램을 올바르게 구현하는 데 도움이되지 않습니다.

메모리 사용량이 과도하지 않도록 응용 프로그램 작동 방식을 설계해야합니다.

메모리에있는 객체의 수와 보유한 횟수 (retainCount보다 작은 숫자)와 보유하고있는 횟수만큼 해제해야합니다. 그들.

개체를 여러 번 유지하려고해도 개체의 복사본 하나만 메모리에 저장됩니다.

메모리 사용량 및/또는 누출 여부를 확인하려면 계측기 누출 감지기를 사용하십시오. 나는 또한 그들을 통해 반복 할 수 있어야하는 NSArray를 투입 한의 UIView의 서브 뷰의 무리가있는 경우 예를 들어

5

은 그 두 배 ... 수를 유지하지 않는

예, 가능합니다.

... 따라서 응용 프로그램의 메모리 사용?

아니요! 결론은 잘못되었습니다. 1000000은 32 비트 정수로 저장 될 때 0만큼의 공간을 차지합니다.

+0

위대한, 그게 많이 도움이됩니다. –

7

retainCount이 반환하는 값은 개체가 보관 된 절대 횟수입니다. UIView은 구현이 불투명 한 프레임 워크에서 제공됩니다. 구현 세부 사항은 사용자가 상호 작용하는 문서화 된 인터페이스에 대해 걱정할 필요가 없습니다.

구현 내에서 UIView의 인스턴스는 구현의 일부로 여러 번 유지 될 수 있습니다. 메모리 측면에서 실제 보유 수는 의미가 없습니다. 1은 5와 같습니다.

코드가 개체를 변경하는 방식은입니다.

코드가 보유 수를 늘리면 코드가 어딘가에 감소해야합니다. 그렇지 않으면 오브젝트가 영원히 머무를 것입니다. retain 인 경우 release (또는 autorelease)이어야합니다. copy 인 경우 release 또는 autorelease이어야합니다. new 또는 alloc 인 경우 release (또는 autorelease)이어야합니다.

그게 전부입니다.

관련 문제