0

来自 .NET 背景,我习惯于重用字符串变量进行存储,那么下面的代码是否可能导致内存泄漏?该代码针对 iphone/itouch,因此没有自动 GC。

-(NSString*) stringExample
{
    NSString *result = @"example";
    result = [result stringByAppendingString:@" test"]; // where does "example" go?

    return result;
}

让我感到困惑的是 NSStrings 是不可变的,但是您可以毫无问题地重用“不可变”变量。

4

3 回答 3

13

它肯定导致内存泄漏。您必须小心重用,因为您必须对底层 NSString 对象的实际实现有很多了解才能决定您是否“安全”。所以,如果你不使用垃圾收集,为了安全起见,你不应该像以前那样重用变量。

例如,这是完全安全的:

NSString *result = @"example";
result = [result stringByAppendingString:@" test"];

因为初始字符串实际上是一个 Objective-C 字符串常量。但是,这会导致内存泄漏:

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

但是,这将是安全的,因为您从一开始就没有拥有结果:

NSString *result = [NSString stringWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

所以基本上,如果您不拥有该对象或者您打开了垃圾收集,那么它是安全的。但是,如果您拥有原始对象并执行此操作,则会泄漏内存。

于 2009-05-10T13:55:29.347 回答
2

附和 Jason 的回答:如果您不调用retain, init,或使用其中一种方法copy,则您不拥有该对象。mutableCopyinitWithSomething

所以在你的代码中,@"example"是一个存储在编译代码中的字符串常量,所以没有什么可以释放的。而且,由于您返回的是 astringWithString您不拥有该对象,并且可以假设它将在将来的某个时候自动释放。

于 2009-05-10T14:37:22.927 回答
0

“它肯定会导致内存泄漏。你必须小心重用,因为你必须对底层 NSString 对象的实际实现有很多了解才能决定你是否“安全”。所以,如果你不使用垃圾收集,为了安全起见,你不应该以你拥有的方式重用变量。”

但是.Net的家伙从来没有使用过会导致内存泄漏的非法语句!上面的语句绝对是合法的,并且会返回字符串@"example test"。

于 2010-03-09T05:02:07.553 回答