Objective-C内存问题

时间:2011-02-26 17:59:22

标签: iphone objective-c memory-management crash nsdictionary

我的应用程序中存在内存管理问题。我有一个NSDictionary实例变量,我设置等于另一个在方法中生成的NSDictionary。这一切都很好,我的应用程序就像我想要的那样,但我在应用正确的内存管理方面遇到了麻烦。

如果我释放本地字典,它最终会导致崩溃,因为重复调用该方法,因为保存在实例变量中的数据也会被删除。这是代码:

NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];

3 个答案:

答案 0 :(得分:2)

使用

创建dictAllValues
 @property(retain) NSDictionary *dictAllValues;

你的方法

-(void) myMethod
{
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"Names" ofType:@"plist"];

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.dictAllValues = dictionary;
[dictionary release];
}

并以dealloc方法发布

-(void) dealloc
{
[dictAllValues release];
[super dealloc];
}

答案 1 :(得分:1)

来自apple memory management guide

作为基本规则的必然结果,如果您需要将接收到的对象存储为实例变量中的属性,则必须保留或复制它。

因此,在这种情况下,将[dictionary release];替换为dealloc方法(或者您可能用于清理的任何其他方法)应该可以正常工作。

我假设您的dictAllValues属性使用简单的分配,如果情况不是这样,请告诉我。

答案 2 :(得分:1)

您如何声明dictAllValues?通常,它将是:

 @property(retain) NSDictionary *dictAllValues;

如果是这样,那么代码中的release是正确的,您的问题就在其他地方。发布崩溃的回溯,使用Build and Analyze并修复任何问题,并尝试启用Zombie检测。