-retainCount
지금까지 어떤 상황에서 사용 하셨는지 , 그리고 결국 사용할 때 발생할 수있는 문제 를 알고 싶습니다 .
감사.
답변
-retainCount
유용한 정보를 알려주지 않기 때문에 절대 사용해서는 안됩니다 . Foundation 및 AppKit / UIKit 프레임 워크의 구현은 불투명합니다. 무엇을 보유하고 있는지, 왜 보유하고 있는지, 누가 보유하고 있는지, 언제 보유하고 있는지 등을 알 수 없습니다.
예를 들면 :
- 1의 값을
[NSNumber numberWithInt:1]
가질 것이라고 생각할 것입니다retainCount
. 그렇지 않습니다. 2입니다. - 1의 값을
@"Foo"
가질 것이라고 생각할 것입니다retainCount
. 그렇지 않습니다. 1152921504606846975입니다. - 1의 값을
[NSString stringWithString:@"Foo"]
가질 것이라고 생각할 것입니다retainCount
. 그렇지 않습니다. 다시 1152921504606846975입니다.
기본적으로 어떤 것이 든 객체를 유지할 수 있고 (따라서 해당를 변경할 수 있으며 retainCount
) 응용 프로그램을 실행하는 대부분의 코드에 대한 소스가 없기 때문에 객체의 retainCount
의미가 없습니다.
객체가 할당 해제되지 않는 이유를 추적하려면 Instruments의 Leaks 도구를 사용하십시오. 개체가 너무 빨리 할당 해제 된 이유를 추적하려면 Instruments의 Zombies 도구를 사용하십시오.
그러나 -retainCount
. 정말 쓸모없는 방법입니다.
편집하다
모두 http://bugreport.apple.com으로 이동하여 -retainCount
더 이상 사용되지 않도록 요청하십시오 . 요청하는 사람이 많을수록 좋습니다.
편집 # 2
업데이트로 [NSNumber numberWithInt:1]
이제는 retainCount
9223372036854775807입니다. 코드에서 2가 될 것으로 예상했다면 이제 코드가 손상되었습니다.
답변
못!
진지하게. 그냥 하지마.
그냥 따라 메모리 관리 지침을 하고 만 것을 해제 alloc
, new
또는 copy
(또는 아무것도 당신이라는 retain
원래시).
@bbum은 여기에서 최고라고 말했고 그의 블로그 에서 더 자세히 설명했습니다 .
답변
Autoreleased 개체는 -retainCount 확인이 정보가없고 잠재적으로 오해의 소지가있는 경우입니다. 보유 수는 객체에서 -autorelease가 호출 된 횟수와 현재 autorelease 풀이 소모 될 때 해제 될 시간에 대한 정보가 없습니다.
답변
내가 할 ‘악기’를 사용하여 확인할 때 매우 유용 retainCounts을 찾을 수 있습니다.
‘allocations’도구를 사용하여 ‘Record reference counts’가 켜져 있는지 확인하고 모든 개체로 이동하여 retainCount 기록을 볼 수 있습니다.
할당과 해제를 페어링하면 진행 상황에 대한 좋은 그림을 얻을 수 있으며 종종 무언가가 해제되지 않는 어려운 경우를 해결할 수 있습니다.
이것은 iOS의 초기 베타 릴리스에서 버그를 찾는 것을 포함하여 결코 실망시키지 않았습니다.
답변
NSObject에 대한 Apple 문서를 살펴보면 다음과 같은 질문을 거의 다룹니다.
NSObject preserveCount
간단히 말해, 자신의 참조 계수 시스템을 구현하지 않는 한 preserveCount는 아마도 쓸모가 없을 것입니다 (그리고 거의 없을 것이라고 보장 할 수 있습니다).
Apple의 말에 따르면, preserveCount는 “일반적으로 메모리 관리 문제를 디버깅 할 때 가치가 없습니다”.
답변
물론 값의 의미는 객체에 적용된 autoreleases 수에 따라 다르며 예측할 수없는 것이기 때문에 코드에서 preserveCount 메서드를 사용해서는 안됩니다. 그러나 디버깅에는 매우 유용합니다. 특히 메인 이벤트 루프 외부에서 Appkit 개체의 메서드를 호출하는 코드에서 메모리 누수를 찾을 때 유용하며 더 이상 사용되지 않아야합니다.
당신의 요점을 밝히기 위해 당신은 가치의 불가해 한 특성을 심각하게 과장했습니다. 항상 참조 횟수가 아니라는 것은 사실입니다. 플래그에 사용되는 몇 가지 특수 값이 있습니다. 예를 들어 객체가 할당 해제되지 않아야 함을 나타냅니다. 1152921504606846975와 같은 숫자는 16 진수로 작성하고 0xfffffffffffffff를 얻을 때까지 매우 신비 해 보입니다. 그리고 9223372036854775807은 16 진수로 0x7fffffffffffffff입니다. 그리고 누군가가 이와 같은 값을 플래그로 사용하기로 선택하는 것은 그리 놀라운 일이 아닙니다 .RetainCount를 초당 100,000,000 번 증가 시켰다고 가정 할 때 retainCount를 더 큰 숫자만큼 높이는 데 거의 3000 년이 걸리기 때문입니다.
답변
그것을 사용함으로써 어떤 문제를 얻을 수 있습니까? 그것이하는 일은 객체의 보유 수를 반환하는 것뿐입니다. 나는 그것을 한 번도 부르지 않았고 내가 할 이유를 생각할 수 없습니다. 그래도 할당이 해제되지 않도록 싱글 톤으로 재정의했습니다.