2011-12-01 3 views
1

여기에 코드가 있습니다.NSNumber가 retaincount를 잘못 계산하는 이유는 무엇입니까?

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     NSNumber *number = [[NSNumber alloc]initWithInt:10]; 
     NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0]; 

     NSLog(@"retain count : %d",[number retainCount]); 

     [array addObject:number]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 

     [number release]; 
     NSLog(@"retain count : %d",[number retainCount]); 
    } 
    return 0; 
} 

내 예상 대답은

retain count : 1 
retain count : 2 
retain count : 1 
retain count : 0 
and then error 

하지만, 실제로 결과를 실행하는 다음과 같습니다.

[Switching to process 6363 thread 0x0] 
2011-12-01 19:39:53.843 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.846 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1 
2011-12-01 19:39:53.848 nsnumber[6363:707] retain count : -1 

이 결과를 이해할 수 없습니다.

왜 결과가 올까요?

답변

1

소개 retainCount

를이 방법은 메모리 관리를 문제를 디버깅 일반적으로 어떤 가치입니다. 프레임 워크 객체의 수를 동시에 오토 릴리즈 풀은 객체에 연기 출시 임의의 수를 보유 할 수 있지만, 그것에 대한 참조를 유지하기 위해에 개체를 유지 한 수 있기 때문에, 당신이 유용 얻을 수있는 가능성은 매우 낮 이 방법은 입니다.

는 참조

http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/retainCount

When to use -retainCount?

3

보유 개수 값을 신뢰하지 마십시오. 특히 ARC를 사용하는 것처럼! 규칙을 따라. 그게 다야.

+0

+1 ARC와 함께 retainCount를 사용할 수 없다는 의미입니다. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html – JeremyP

+0

AFAIK, 이것은 ARC 하에서 컴파일되지 않습니다. 'retainCount'를 사용하면 오류가 발생합니다. –

3

NSNumber는 특정 숫자에 대해 싱글 톤 인스턴스를 반환합니다 (정수 1 - 12 또는 뭔가 있다고 생각합니다).

혹시 retainCount의 값에 의존해서는 안됩니다. 보유 수를 변경할 수있는 코드 또는 프레임 워크 코드에서 여러 가지 일이 발생할 수 있습니다.

1

retainCount의 반환 형식이 NSUInteger이다; 그것은 부호가없는 정수입니다. string format specifier%d이고 부호가 인 정수입니다. 객체 공개되지 않습니다 -

코코아는 불멸의 객체의 보유 수를 표현하기 위해 NSUIntegerMax를 사용합니다. 성능상의 이유로 작은 정수를 나타내는 NSNumber 개체를 캐시하고 재사용합니다.이 중 NSNumber은 분명히 그 중 하나이며 영구적입니다.

이 (two's complement arithmetic 아래)에 서명하는 것처럼 최대 부호없는 정수 값을 해석

, -1 것으로 보인다.

내가 위의 링크 차트로 표시대로, 지정자 %lu를 사용해야은 "true"로 값을 참조하십시오.

그러나 일반적으로 shouldn't rely on retainCount to give you any useful information.이 is documented : 프레임 워크 객체의 수는 같은 시간에 오토 릴리즈 풀이 객체에 연기 출시 임의의 수를 보유 할 수 있지만, 그것에 대한 참조를 보관 유지하기 위해서 객체를 유지 한 수 있기 때문에

, 그것은 아주이다 이 방법으로 유용한 정보를 얻을 수는 없습니다.

beryllium already noted.

관련 문제