iPhone内存管理

标签 iphone memory-management

我正在开发一个应用程序,我想确保我正确管理内存并释放我应该释放的所有内容。在我的 viewDidLoad 方法中,我分配了一些变量来确定应用于 View 的背景(用于国际化),如果我不释放它们,应用程序可以正常工作。

问题是,如果我释放变量,应用程序就会崩溃。 viewDidLoad 的代码如下:

// Set the background image based on the phone's preferred language
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *backgroundImageName = [[NSString alloc] init];
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];
self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]];

... do some more initialization stuff ...

// IF THE FOLLOWING ARE RELEASED THE APP WILL CRASH!!!
//[backgroundImageName release];
//[language release];

为什么释放backgroundImageName和语言变量会导致应用程序崩溃?

最佳答案

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];

这里,language 不需要释放,因为 objectAtIndex: 会为您自动释放它。按照惯例,如果您分配新建复制对象,那么您就拥有该对象,否则您就没有该对象。

self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]];

这里,UIColor 对象确实需要释放(因为您分配了它)。

NSString *backgroundImageName = [[NSString alloc] init];
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];

这里,[[NSString alloc] init] 返回的字符串确实需要释放(因为您已经分配了它)。但是,下一行将 backgroundImageName 更改为指向新的自动释放字符串,丢失对原始字符串的最后一个引用而不释放它(内存泄漏)。 backgroundImageName 不应被释放,因为它已经自动释放了。

您可以通过释放 UIColor 并消除未使用的字符串来避免泄漏。例如:

NSString *backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];

...和...

UIColor* backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]];
self.view.backgroundColor = backgroundColor;
[backgroundColor release];

关于iPhone内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2078016/

相关文章:

php - php中允许的内存大小为33554432字节耗尽(尝试分配43148176字节)

C++/3D 地形:std::vector push_back() 与 c0000374 崩溃

iphone - 更新Apple App Store元数据

iphone - 如何以编程方式捕获 iPhone 控制台日志?

c - 堆内存和板坯分配

pointers - Fortran 90 数组按引用传递问题

r - 如何使用 foreach 克服内存限制

iphone - 当我的 viewDidDisappear 时,我尝试释放我的表格。当我回到视野时仍然在那里

iphone - SimpleTabBarController 泄漏内存

iphone - 将事件指示器添加到另一个 View ( View 到另一个 View )时发生内存泄漏