如果我取消发布声明,这个程序会崩溃。我知道我过度释放并很快意识到这一点。但是,为了测试僵尸,我打开它们(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
答案 0 :(得分:2)
这是因为你没有你试图发布的对象(你没有对它们的引用)。他们的所有权归“最近的”NSAutoreleasePool所有。
您可以阅读有关对象所有权here的信息。作为快速参考,通常情况下,如果您没有自己调用alloc
方法来创建对象,或者您没有retain
它,则您不是所有者。 Retain
一个物体会使你成为一个拥有者;调用release
意味着您放弃所有权(如果没有更多所有者,则会解除分配对象)。
您不得发布您没有所有权的对象。您当前的代码没有发布正是您所需要的。
答案 1 :(得分:1)
那么,僵尸会告诉你免费对象何时收到正确的版本?那么,如果您没有发送该版本(您已将其评论出来),您将不会看到僵尸抱怨?
您的NSString / NSNumber方法都是方便的方法,您不必释放它们。所以 - 耶,你自己解决了这个问题。