2010-08-13 3 views
2

Objective-C 메모리 관리에서 retain/release 메소드를 테스트하는 간단한 프로그램을 만들었습니다. ObjC 메모리 관리에 대해 알고 있듯이, retain count = 1 인 객체를 으로 호출하면이라는 리 테인 수가 0으로 감소한 다음 릴리스됩니다.retainCount = 1 인 obj에서 [obj release]를 수행해도 retainCount가 0으로 감소하지 않습니다.

// TestClass.h 
#import <Cocoa/Cocoa.h> 
@interface TestClass : NSObject { 
} 
@end 

// TestClass.m 
#import "TestClass.h" 
@implementation TestClass 
@end 

// RetainRelease.m 
#import <Foundation/Foundation.h> 
#include "TestClass.h" 

void dumpRetain(id o); 

int main (int argc, const char * argv[]) { 
    TestClass *s = [[TestClass alloc] init]; 
    dumpRetain(s); 

    [s release]; 
    dumpRetain(s); 
} 

출력 :

2010-08-13 17:42:45.489 RetainRelease[20933:a0f] NSString - retain count=1 
2010-08-13 17:42:45.491 RetainRelease[20933:a0f] NSString - retain count=1 

누군가가 그것을 설명 할 수 있지만,이 테스트 프로그램은 첫 번째 릴리스 후 나는 아직도 계수 = 1을 유지할 수 있음을 보여? 감사합니다.

답변

8

왜 0으로 감소해야합니까? release 보유 개수가 1 인 개체는 개체가 파괴되므로 에 더 이상 retainCount가 없습니다. 그렇다면 몇 나노초 후에 왜 0으로 변하는 것이 귀찮을까요?

또한 retainCount의 관점에서 물건에 대해 생각하지 마십시오. 당신은 결국 좌절에서 벗어나게 될 것입니다. 대신에 "내가이 객체를 소유하고 있습니까? 내가 그렇게하면이 객체의 소유권을 완전히 포기할 수 있습니까?"

이러한 질문에 올바르게 답할 수 있다면 그게 전부입니다.

+0

답변 해 주셔서 감사합니다. 이 일러스트레이션으로 인해 0으로 감소 할 것으로 예상했습니다. http://cocoadevcentral.com/images/articles/000094/learnobjectivec-referencecounting.png 이 코드를 사용하면 참조 카운팅이 추상 지점에서 어떻게 작동하는지 보여 주려고합니다 보기; 나는 "당신이이 객체를 소유하고 있는가"에 대해 생각하는 것이 앱 프로그래밍 관점에서 훨씬 낫다는 것에 동의합니다. – Max

+3

@Max "retainCount가 0에 도달 할 때 객체의 할당이 해제 될 때"에 대해 생각하면 사실을 쉽게 이해할 수 있습니다. 그러나, "retainCount가 1 인 객체가 릴리즈 될 때, 할당이 해제됩니다"라고 구현됩니다. 0으로 감소시킬 필요가 없기 때문에 구현됩니다. 구현 최적화입니다. –

+0

해명 해 주셔서 감사합니다. – Max

관련 문제