iPhone内存管理

3

我正在开发一款应用程序,希望确保我正确地管理内存并释放所有需要释放的。在我的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];

为什么释放backgroundImageName和language变量会导致应用程序崩溃?
3个回答

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

这里,language不需要被释放,因为objectAtIndex:会自动为您释放它。按照惯例,如果您已经使用allocnewcopy创建了一个对象,那么您就拥有该对象,否则您就没有。

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

在这里,UIColor对象需要被释放(因为你已经对它进行了alloc)。
NSString *backgroundImageName = [[NSString alloc] init];
backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];

这里[[NSString alloc] init]返回的字符串需要释放(因为你已经使用了alloc)。然而,下一行将backgroundImageName更改为指向一个新的自动释放字符串,丢失对原始字符串的最后一个引用而没有释放它(内存泄漏)。backgroundImageName不应该被释放,因为它已经是自动释放的。
您可以通过释放UIColor并消除未使用的字符串来避免泄漏。例如:
NSString *backgroundImageName = [NSString stringWithFormat:@"background-%@.png",language];

... and ...

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

0

简短回答: 当您使用没有单词init的构造函数创建对象时,您不需要负责释放它

请参见this以获取更多解释

此外,管理指南是了解Objective-C内存管理更多信息的绝佳资源


0

你并没有创建语言字符串,而是只获取了一个引用。只有那些在方法名中包含 "new"、"copy" 或 "alloc"(按照惯例)的方法才会返回非自动释放对象。对于所有其他方法,假定你将丢弃变量,因此如果你想保留它,必须对其进行保留。这个问题的另一面是:除非你保留了它们,否则不应该释放这些返回的对象。

这段代码中的另一个问题是 backgroundImageName 被赋值了两次。第一个初始化被忽略了。去掉它,只保留第二个初始化,并且去掉两个 -release 调用,它们是不需要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接