来自.NET背景我用来重用字符串变量来存储,下面的代码是否可能导致内存泄漏?该代码针对iphone / itouch,因此没有自动GC。
-(NSString*) stringExample
{
NSString *result = @"example";
result = [result stringByAppendingString:@" test"]; // where does "example" go?
return result;
}
让我感到困惑的是NSStrings是不可变的,但你可以重复使用'immutable'变量没有问题。
答案 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回答:如果你不打电话给retain
,init
,copy
,mutableCopy
或使用其中一种initWithSomething
方法,你不拥有对象。
因此,在您的代码中,@"example"
是存储在已编译代码中的字符串常量,因此无需释放。并且,由于您返回的是stringWithString
,因此您不拥有该对象,并且可以假设它将在未来的某个时间点自动释放。
答案 2 :(得分:0)
“它肯定会导致内存泄漏。您必须小心重用,因为您必须了解很多关于底层NSString对象的实际实现,以确定您是否”安全“。所以,如果您不使用垃圾收集,为了安全起见,您不应该按照您的方式重复使用变量。“
但是.Net的家伙从未使用会导致内存泄漏的非法语句!上述陈述绝对合法,并将返回字符串@“example test”。