我正在查看别人的代码,并注意到他们在他们不拥有的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 = ?
代码“工作”的原因是因为NSString的-initWithString:识别传入的字符串是一个常量字符串,因此不需要新的分配。由于常量字符串有效地忽略保留/释放,因此代码巧合地工作。 – bbum 2010-06-18 17:16:39