我正在开发一个应用程序,我想确保我正确管理内存并释放我应该释放的所有内容。在我的 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/