2011-03-05 6 views
2

개체를 만들고 보유 횟수를 확인하면 예상대로 1이됩니다. 개체를 해제하고 유지 횟수를 다시 확인하면 여전히 1입니다. 개체를 할당 해제하지 않아도되고 개수가 0이어야합니까?[obj release]가 해제되어야 할 때 참조 카운트는 여전히 1입니다.

NSMutableString *str=[[NSMutableString alloc] initWithString:@"hello"]; 
NSLog(@"reference count is %i",[str retainCount]); 
[str release]; 
NSLog(@"reference count is %i",[str retainCount]); 

나는 내가 처음 nilstr를 설정하면이 유지 카운트 0을 참조 할 . 왜 그런가요?

답변

2

retainCount을 사용하지 마십시오. 대부분의 경우 예상 한대로 작동하지 않습니다.

두 번째 NSLog은 할당 해제 된 메모리를 객체로 액세스합니다. 이 특별한 경우에, 할당 해제 된 메모리는 여전히 retainCount 메서드가 호출 될 때 프로그램이 충돌하지 않도록 해제 된 NSString의 이전 데이터가 충분히 포함되어 있습니다. NSZombieEnabled으로 실행했다면 할당 해제 된 인스턴스에 메시지를 보내는 것에 대한 오류 메시지가 표시됩니다.

nil을 호출 할 때 0을 반환하는 이유는 정수를 반환하는 메서드가 nil 객체에서 호출 될 때 항상 0을 반환한다는 것입니다.

+0

그 많은 설득력 ... 고마워 ... 또한 NSZombieEnabled가 활성화 된 프로그래밍 도구로 도망치면 프로그램도 추락했다 ... – devaditya

+0

간결하게 말하면; 할당 해제 된 객체를 메시징하면 정의되지 않은 동작이 발생합니다. 이야기의 끝. – bbum

2

retainCount에 의존하지 마십시오. 그리고 이것에 신경 쓰지 마라. 후드 아래에서 많은 일이 발생할 수 있습니다. 소유 한 모든 것을 발표했는지 확인해야합니다. 메모리가 누출되지 않도록하려면 NSLog에 retainCount가 아니라 Instrument를 사용하십시오.

+0

이 답변은 예상대로 ... 잘 [obj release] 이후에 참조 수가 감소합니다 ... 실용적인 구현이었습니다 ... 누출 여부를 확인하지 않아도 ... 감사합니다 .. – devaditya