过度释放的问题和僵尸

时间:2010-01-23 22:05:05

标签: objective-c debugging nszombies

如果我取消发布声明,这个程序会崩溃。我知道我过度释放并很快意识到这一点。但是,为了测试僵尸,我打开它们(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

2 个答案:

答案 0 :(得分:2)

这是因为你没有你试图发布的对象(你没有对它们的引用)。他们的所有权归“最近的”NSAutoreleasePool所有。

您可以阅读有关对象所有权here的信息。作为快速参考,通常情况下,如果您没有自己调用alloc方法来创建对象,或者您没有retain它,则您不是所有者。 Retain一个物体会使你成为一个拥有者;调用release意味着您放弃所有权(如果没有更多所有者,则会解除分配对象)。

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

答案 1 :(得分:1)

那么,僵尸会告诉你免费对象何时收到正确的版本?那么,如果您没有发送该版本(您已将其评论出来),您将不会看到僵尸抱怨?

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