重用NSString变量 - 它是否会导致内存泄漏?

时间:2009-05-10 13:31:48

标签: objective-c memory-management nsstring pointers

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

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

    return result;
}

让我感到困惑的是NSStrings是不可变的,但你可以重复使用'immutable'变量没有问题。

3 个答案:

答案 0 :(得分: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"];

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

答案 1 :(得分:2)

Jason回答:如果你不打电话给retaininitcopymutableCopy或使用其中一种initWithSomething方法,你不拥有对象。

因此,在您的代码中,@"example"是存储在已编译代码中的字符串常量,因此无需释放。并且,由于您返回的是stringWithString,因此您不拥有该对象,并且可以假设它将在未来的某个时间点自动释放。

答案 2 :(得分:0)

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

但是.Net的家伙从未使用会导致内存泄漏的非法语句!上述陈述绝对合法,并将返回字符串@“example test”。