2011-07-09 30 views
2

要我创建的变量内存泄漏,下面的代码看起来像它会创建一个泄漏 - 我可能是错的这个虽然:的内部方法

-(NSString*) myString{ 

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

} 

我的问题是:

1)请问foo是不是释放内存泄漏?

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

回答

3

简答题。这段代码不会泄漏。

龙答:

用的NSString它并不总是可见的泄漏,因为串实习生,因为你不叫分配/新/复制方法。但是,是的,这是一般的内存泄漏的典型点。

有两种处理方法。

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

而这一次是类似于:

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

所以,你会返回一个对象,具有保留计数1,但会被自动释放。所以,当NSAutoreleasePool被耗尽时,这个对象将会消失。

+0

Thsnks亚历克斯,伟大的解释 – PowerAktar

4

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

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

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

+0

对于静态字符串,[foo copy]无论如何都应该返回相同的静态字符串。 [foo retain]什么都不做。所以仍然没有泄漏(但当然也不一定是好的形式) –