iPhone内存管理

Joh*_*kes 3 iphone memory-management

我正在研究一个应用程序,我想确保我正确地管理内存并释放我应该做的一切.在我的viewDidLoad方法中,我在确定要应用于视图的背景(用于国际化)时分配一些变量,如果我不释放它们,应用程序工作正常.

问题是,如果我发布变量,应用程序将崩溃.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];
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*ris 6

NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

在这里,language不需要发布,因为objectAtIndex:它自动为您释放.按照惯例,如果您alloc编辑,new编辑或copy编辑它,则拥有一个对象,否则您不会.

self.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]];
Run Code Online (Sandbox Code Playgroud)

这里,UIColor确实需要释放对象(因为你alloc编写了它).

NSString *backgroundImageName = [[NSString alloc] init];
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];
Run Code Online (Sandbox Code Playgroud)

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

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

NSString *backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];
Run Code Online (Sandbox Code Playgroud)

......而且......

UIColor* backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:backgroundImageName]];
self.view.backgroundColor = backgroundColor;
[backgroundColor release];
Run Code Online (Sandbox Code Playgroud)