2011-10-14 6 views
0

릴리스 이후에 클래스 객체가 여전히 존재하는 이유는 누구든지 설명 할 수 있습니까? 여기릴리스 이후에 존재하는 객체

#import <Foundation/Foundation.h> 
#import "MyClass.h" 
int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    MyClass *class = [[MyClass alloc] init]; 

    NSLog(@"%@", [class showMouse]); 
    NSLog(@"%@", [class printKbd]); 

    [class release]; 

    NSLog(@"%@", [class printKbd]); 
    //still exist 

    [pool drain]; 
    return 0; 
} 
+1

'release' 객체를 호출하면 더 이상 필요 없다는 것을 알 수 있습니다. 나중에 언젠가는 풀려날거야. – Nekto

답변

2

이 사실의 dealloc 이 전화를받을 수행하는 코드는, 당신은 MyClassdealloc 방법 내부 NSLog(@"dealloc called")를 추가하여 확인할 수 있습니다.

왜 여전히 작동합니까? 객체가 해제되면 메모리는 0으로 설정되지 않고 단순히 시스템에서 자유롭게 사용할 수 있도록 표시됩니다. 결과적으로 코드는 포인터의 주소에 여전히 존재할 수 있고 *class은 단순히 메모리 블록에 대한 포인터입니다. Here's the great SO answer that explains it in details.

중요한 것은 프로그램 실행이 더 이상 지속되면 [class printKbd]에 대한 호출이 중단 될 가능성이 높다는 것입니다. 그래서 nil을 포인터에 할당하는 것이 중요합니다. 단지 메모리의 정의되지 않은 부분에 액세스하지 않도록하기 위해서입니다.