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拥有一个对象使您成为所有者;调用release意味着您放弃所有权(如果对象没有更多所有者,则将释放该对象)。

不得释放您没有所有权的对象。您当前没有发布的代码正是您所需要的。

于 2010-01-23T22:16:13.087 回答
1

好吧,当一个被释放的对象收到一个释放时,僵尸会告诉你正确的吗?那么,如果您不发送版本(您已将其注释掉),您不会看到僵尸抱怨吗?

你的 NSString/NSNumber 方法都是方便的方法,你不必释放它们。所以 - 是的,你自己解决了这个问题。

于 2010-01-23T22:10:21.117 回答