调用'release'太多次了?
问题描述:
我正在查看别人的代码,并注意到他们在他们不拥有的NSString上调用'release'(从未在任何地方调用alloc/retain/copy并且它不是属性)。调用'release'太多次了?
这对我来说看起来有点奇怪,它让我想知道如果你对一个你不是'拥有'或者其引用计数已经是0的对象调用'release'会不会发生奇怪的行为?下面的代码编译/运行良好没有警告,所以我猜没有问题,但我只是好奇。
// Releasing an object I don't own
NSString *notMyString = [NSString stringWithString:@"Not mine."];
[notMyString release]; // Ignored?
// Releasing an object I own, twice
NSString *myString = [[NSString alloc] initWithString:@"Mine."];
[myString release]; // Ref count = 0
[myString release]; // Ref count = ?
答
是的,不要那样做。您的评估是正确的,您对所有权规则的理解也是正确的。向已经发布的对象发送消息具有未定义的行为 - 有时你会因为其他事情发生而幸运,并且什么都不会发生。有时你会立即崩溃,有时候会因为你损坏了别的东西而崩溃。
+2
是的,这是我所担心的长期行为。猜猜你不能总是相信随机博客'教程'代码as-is =)。感谢你及时的答复。 – nebs 2010-06-18 16:18:32
代码“工作”的原因是因为NSString的-initWithString:识别传入的字符串是一个常量字符串,因此不需要新的分配。由于常量字符串有效地忽略保留/释放,因此代码巧合地工作。 – bbum 2010-06-18 17:16:39