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

Chr*_*s S 0 pointers memory-management objective-c nsstring

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

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

    return result;
}
Run Code Online (Sandbox Code Playgroud)

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

Jas*_*oco 13

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

例如,这是完全安全的:

NSString *result = @"example";
result = [result stringByAppendingString:@" test"];
Run Code Online (Sandbox Code Playgroud)

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

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];
Run Code Online (Sandbox Code Playgroud)

然而,这是安全的,因为你从来没有在第一时间拥有结果:

NSString *result = [NSString stringWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];
Run Code Online (Sandbox Code Playgroud)

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