2009-10-16 5 views
0

간단한 코드를 작동하는 것은 이상한 동작이 발생합니다 :은 오브젝티브 C에 어느

#import Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSObject *obj = [[NSObject alloc] init]; 
    NSLog(@"retain count %d",[obj retainCount]);//print 1 
    [obj release];//obj deallocated 
    NSLog(@"retain count %d",[obj retainCount]); //still printing 1 in Snow Leopard! Why?? 


    [pool drain]; 
    return 0; 
} 

두 번째 NSLog() 인쇄해야합니다 "메시지가 해제 된 객체로 전송 retainCount = 0x103eb0을". Leopard를 사용하면 모든 것이 정상적으로 작동하지만 Snow Leopard에서는 두 번째 NSLog가 여전히 1을 인쇄합니다.

Snow Leopard 버전의 Xcode에 버그가 있습니까?

답변

6

this을 참조하십시오.

이것은 버그가 아닙니다. 보유 카운트가 1 인 객체를 릴리스하면 objc 런타임은 단순히 dealloc을 호출하고 보유 수를 줄이지 않습니다. 그것이 항상 효과가 있습니다. 또한 객체가 dealloc으로 전송 되었기 때문에 힙에있는 데이터가 즉시 삭제된다는 의미는 아닙니다. 나중에 파괴로 표시됩니다.

+1

메모리는 "파괴 된 것으로 표시"되어 있지 않으므로 "다른 것으로 다시 사용할 수 있습니다". 그러나 해방 될 때 해방 된 메모리를 명시 적으로 덮어 쓸 수있는 것은 없습니다. – Ken

2

해제 된 인스턴스에 메시지를 보내는 중 동작이 정의되지 않음입니다. 당신은 그것을하지 말아야합니다. 그것은 일할 수있다; 그것은 할 수 없었다. 당신이 그것을하기로되어 있지 않기 때문에 결과가 당신의 기대와 일치하도록 그것을 만들 필요가 없습니다.

1

응용 프로그램의 환경 변수에 NSZombieEnabled ~ YES을 설정하면 Foundation에서이 프로그래밍 오류를 감지하여 디버깅에 유용한 콘솔 메시지로보고 할 수 있습니다.