2010-01-23 2 views
0

릴리스 문구를 주석 처리하지 않으면이 프로그램이 충돌합니다. 나는 그것이 지나치다는 것을 알게되고 그것을 빨리 깨달았다. 하지만 좀비를 테스트하기 위해 NSZombiesEnabled = YES 및 CFZombieLevel = 16으로 설정하고 프로그램을 실행하고 예외를 throw하지 않습니다.다시 릴리스하는 문제와 좀비

무엇을 제공합니까? 나는 좀비를 켜는 것이 내게 무슨 doofus인지 말했을 것이다 ... 고쳐주지 마라.

#import "AppController.h" 


@implementation AppController 

-(IBAction)countCharacters:(id)sender { 
    //did a button do this? 
if(![sender isKindOfClass:[NSButton class]]) { 
    NSLog(@"%@ is not a button", sender); 
    return; 
} 

//proceed 
NSString *userString = [textField stringValue]; 
NSNumber *count = [NSNumber numberWithInt:[userString length]]; 
NSString *outputString = [NSString stringWithFormat:@"'%@' has %@ characters.", 
         userString, count]; 
//[userString release]; 
//[count release]; 
[labelField setStringValue:outputString]; 
//[outputString release]; 
} 
@end 
+0

발신자를 - (IBAction) countCharacters :(NSButton *) 발신자로 변경하지 않는 이유는 무엇입니까? 그렇게하면 확인할 필요가 없습니다. GUI를 통해서만 호출되지 않는 한. – zneak

+0

@zneak; 그건 말이되지 않습니다. 액션 메소드는 항상'- (IBAction) selector : (id) sender'입니다. 그리고 당신이 검사하는지 여부는 표적/행동이 어떻게 작동하는지에 대해 완전히 직각입니다. – bbum

+0

@bbum; 그것은 의미가 있습니다. 명시 적으로 어떤 종류의 객체가 액션을 전송할 것으로 예상되는지 알려주면 Interface Builder에서 다른 유형의 객체에 액션을 할당하는 것을 불가능하게 만든다. 분명히 그가 원하는 것입니다. 나는 완전히 바보 같은 말을했을 때를 두 번 확인했고, 내가 그 말을 정확하게 묘사 한 것처럼 행동했다. – zneak

답변

2

공개하려고하는 객체를 소유하지 않았기 때문에 (참조를 보유하지 않은 것) 때문입니다. 그들의 소유권은 "가장 가까운"NSAutoreleasePool에 주어집니다.

개체 소유권 here에 대해 읽을 수 있습니다. 일반적으로 빠른 참조로 개체를 만들려면 alloc 메서드를 직접 호출하지 않았거나 retain 메서드를 호출하지 않은 경우 사용자가 소유자가 아닙니다. 객체가 있으면 소유자가됩니다. release을 호출하면 소유권을 포기 함 (소유자가 더 이상 없으면 개체의 할당을 해제 함)을 의미합니다.

은 사용자가 소유권이없는 릴리스 개체가 아니어야합니다 (예 :). 현재 코드를 공개하지 않고 정확히 필요한 것입니다.

+0

정확합니다. 즉, 주석 처리 된 행의 주석을 풀고 좀비를 실행하면 좀비 로깅 메커니즘이 실행됩니다. – bbum

+0

감사합니다. 나는 그들을 풀어서는 안된다는 것을 알았지 만, 왜 그렇게하지 않았는지를 클릭하지는 않았다. – griotspeak

+0

@bbum,하지만 그들은 ... 질문의 요점은 – griotspeak

1

자유로운 대상이 릴리스를 올바르게 수신하면 좀비가 알려줍니다. 그래서, 만약 당신이 릴리스 (당신이 그것을 밖으로 주석)를 보내지 않는다면 당신은 좀비들이 불평하는 것을 보지 못할 것입니다.

NSString/NSNumber 메서드는 모두 편리한 메서드이므로 해제 할 필요가 없습니다. 그래서 - 네, 당신은 스스로 문제를 해결했습니다.