gpt4 book ai didi

Objective-C/iPhone 内存管理

转载 作者:行者123 更新时间:2023-12-04 07:04:31 25 4
gpt4 key购买 nike

在我的 iPhone 应用程序中,我有一个通过以下方法显示的“统计” View - 当用户触摸按钮时调用该方法本身。此方法在 UINavigationController

- (void) showStatsView {
StatsViewController *statsViewController = [[StatsViewController alloc] initWithNibName:@"Stats" bundle:[NSBundle mainBundle]];
[self pushViewController:statsViewController animated:YES];
[statsViewController release]; // (1)
}

在统计 View 本身中,一个 NSDictionary , “ statsDict ”被使用。它被声明为具有以下选项的属性:(非原子,保留)。

在我的 StatsViewController 中, viewDidLoad方法创建 NSDictionary 的实例像这样:
MyAppDelegate *appDelegate= (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
stats = [[NSDictionary alloc] initWithContentsOfFile:[appDelegate statsFilePath]];

我的 StatsViewController 的 dealloc 方法如下所示:
 - (void)dealloc {

/*
dealloc'ing other stuff here which is irrelavent
*/
[statsDict release]; // (2)
[super dealloc];
}

如果我在显示一次之后尝试重新加载统计 View ,我的问题就会出现,也就是说 - 我按下导致 showStatsView 触发的按钮,这将加载统计 View (第一次),目前一切正常。

如果我然后按下统计 View 上的按钮返回主菜单(通过调用使用 [self popToViewController:MainMenuViewController]; 的方法完成) - 从这里,如果我再次按下加载统计 View 的按钮(对于第二次),我的应用程序崩溃了 EXC_BAD_ACCESS .

如果我删除 showStatsView 中标记为 (1) 的行,则它可以正常工作,就像删除 dealloc 中标记为 (2) 的行一样。但是,根据我的阅读,我应该释放 statsDict,因为我分配了它,同样,我应该释放 statsViewController,因为我也分配了它。但是,如果我两者都做 - 它会崩溃!我该怎么办?

我是否错过了对 Objective-C 内存管理的理解?

最佳答案

你对契约(Contract)的理解似乎是正确的(假设你的意思是“statsDict =”,你说“stats =”)。

所以问题出在其他地方,很可能在其他地方违反了契约(Contract)。

我建议您使用环境变量打开一些内存调试 NSZombieEnabledNSAutoreleaseFreedObjectCheckEnabled看看它是否告诉你哪个对象被过度释放。

关于Objective-C/iPhone 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1315080/

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