0

リリース ステートメントのコメントを外すと、このプログラムがクラッシュします。リリースしすぎていることに気づき、すぐに気づきました。しかし、ゾンビをテストするためだけに、ゾンビをオン (NSZombiesEnabled = YES および CFZombieLevel = 16) にすると、プログラムは正常に実行され、例外はスローされません。

何が与えますか?ゾンビをオンにすると、私がなんて馬鹿げているかがわかると思いました...修正しないでください。

#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
4

2 に答える 2

2

これは、解放しようとしているオブジェクトを所有していない (オブジェクトへの参照を保持していない) ためです。それらの所有権は、「最も近い」NSAutoreleasePool に与えられます。

オブジェクトの所有権については、こちらを参照してください。クイック リファレンスとして、通常、allocメソッドを自分で呼び出してオブジェクトを作成しなかった場合、またはそうしなかった場合は、所有者ではありませんretainRetainオブジェクトを ing すると所有者になります。呼び出しreleaseは、所有権を放棄することを意味します (オブジェクトに所有者がいなくなった場合はオブジェクトの割り当てを解除します)。

所有権のないオブジェクトを解放してはなりませんリリースのない現在のコードはまさにあなたが必要としているものです。

于 2010-01-23T22:16:13.087 に答える
1

ええと、解放されたオブジェクトが解放されたときにゾンビが教えてくれますよね?では、リリースを送信しない場合 (コメントアウトした場合)、ゾンビが文句を言うのを見ることはありませんか?

NSString/NSNumber メソッドはすべて便利なメソッドであり、解放する必要はありません。ええ、あなたは自分で問題を解決しました。

于 2010-01-23T22:10:21.117 に答える