gpt4 book ai didi

iPhone内存管理

转载 作者:行者123 更新时间:2023-12-03 19:38:06 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com