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