在方法内创建的变量的内存泄漏

时间:2011-07-09 12:08:28

标签: iphone objective-c ios4 iphone-sdk-3.0

对我来说,以下代码看起来会产生泄漏 - 尽管如此我可能错了:

-(NSString*) myString{

   NSString* foo  = @"bar";
   return foo;

}

我的问题是:

1)由于foo未被释放,是否会造成内存泄漏?

2)如果是内存泄漏,那我该如何避免呢?

2 个答案:

答案 0 :(得分:4)

这不是泄漏。 @“bar”是静态分配的字符串,因此不需要保留foo。您可以像处理自动释放的对象一样处理这些字符串,尽管它们会在内存中抵制应用程序的运行时。

您可以通过返回[foo retain][foo copy]将其变为泄漏。

从技术上讲,保留静态变量是没有意义的。但如果你复制它们,你必须释放它们。

答案 1 :(得分:3)

简短回答。此代码不会泄漏。

答案很长:

使用NSString并不总是可见泄漏,因为字符串实习生并且因为您没有调用alloc / new / copy方法。但是,是的,这是一般的内存泄漏的经典点。

有两种方法可以处理它。

  • 跟踪您从此(或类似)方法返回的所有对象并释放它们。这几乎每次都是非常错误的可能性和非常糟糕的。
  • 返回自动释放的实例。事实上,你在这里隐含地做了类似的事情。此字符串分配类似于:
NSString *foo = [NSString stringWithString:@"bar"];

这个类似于:

NSString *foo = [[[NSString alloc] initWithString:@"bar"] autorelease];

因此,您将返回一个保留计数为1但仍自动释放的对象。因此,当NSAutoreleasePool被耗尽时,此对象将消失。

相关问题