2010-06-18 60 views
5

我正在查看别人的代码,并注意到他们在他们不拥有的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

代码“工作”的原因是因为NSString的-initWithString:识别传入的字符串是一个常量字符串,因此不需要新的分配。由于常量字符串有效地忽略保留/释放,因此代码巧合地工作。 – bbum 2010-06-18 17:16:39

回答

15

是的,不要那样做。您的评估是正确的,您对所有权规则的理解也是正确的。向已经发布的对象发送消息具有未定义的行为 - 有时你会因为其他事情发生而幸运,并且什么都不会发生。有时你会立即崩溃,有时候会因为你损坏了别的东西而崩溃。

+2

是的,这是我所担心的长期行为。猜猜你不能总是相信随机博客'教程'代码as-is =)。感谢你及时的答复。 – nebs 2010-06-18 16:18:32