2010-08-01 88 views
2

在几个例子代码中的一个可以找到这个简单的问题释放分配的内存

static NSNumberFormatter *numberFormatter = nil; 
if (numberFormatter == nil) { 
    numberFormatter = [[NSNumberFormatter alloc] init]; 
    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
    [numberFormatter setMaximumFractionDigits:6]; 
} 

是不是编码产生内存泄漏?还是有一些内置的魔法,释放分配的内存?

Regards

回答

0

此示例将会泄漏。你有一个保留一个位置的个性化......

numberFormatter = [[NSNumberFormatter alloc] init]; 
4

在我看来,这一段代码来自的地方,implemets了“单模式”,或者非常类似的东西给它。 由于变量是static,它的值将在函数调用之间被记住。这意味着它在应用程序的生命周期中只分配一次

在此代码中,numberFormatter变量似乎是应用程序在其整个生命周期中随时需要的东西 - 因此无需释放它。
更准确地说,如果应用程序经常需要它,则释放它可能不切实际。这会导致不必要的内存分配和重新分配操作。

注意属于您的应用程序所有内存被操作系统释放应用程序不再运行后。
这样,分配给该变量的内存也将被释放。

如果此对象使用除内存以外的资源,则需要显式清理,但如果不使用,则不需要。

2

我不认为它会泄漏内存,因为numberFormatter变量是static,这意味着它只有一个副本,并且引用停留在函数调用之间。由于你唯一一次制作一个新的,如果一个不存在,你只会有一个副本。

-1

当你做一个“黄金”,像这样:

numberFormatter = [[NSNumberFormatter alloc] init]; 

你要“放开”的对象,否则会泄漏:

[numberFormatter release]; 
+0

在这个例子中你忘了变量是静态的。 – Venemo 2010-08-05 08:24:52

1

这样看来的意图这段代码是一次性分配numberFormatter并在程序的整个生命周期中保持活跃状态​​。由于所有内存在应用程序关闭时都会自动释放,因此在以这种方式使用时不需要释放内存。尽管如此,释放你保留的每一块内存仍然是一个好习惯。