使用导航控制器弹出视图控制器时释放内存的问题

Posted

技术标签:

【中文标题】使用导航控制器弹出视图控制器时释放内存的问题【英文标题】:Problems releasing memory when popping a viewController using a navigationController 【发布时间】:2010-08-17 08:42:42 【问题描述】:

我遇到以下问题。当我按下返回按钮弹出视图控制器时,不会调用 dealloc 方法。

这是我正在使用的代码:

NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);

coleccionVista = [[coleccionViewController alloc] init];
NSString *nombreColeccion = [colecciones objectAtIndex:i];
coleccionVista.nombreColeccion = nombreColeccion;
coleccionVista.title = [NSString stringWithFormat:coleccionVista.nombreColeccion];
NSLog(@"coleccionVista retain count1: %i",[coleccionVista retainCount]);

[self.navigationController pushViewController:coleccionVista animated:NO];
NSLog(@"coleccionVista retain count2: %i",[coleccionVista retainCount]);

[coleccionVista release];
//[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);

我在控制台上收到这些消息:

第一次推送视图:

2010-08-17 10:30:36.019 TAU 4[50133:207] coleccionVista retain count0: 0
2010-08-17 10:30:36.021 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:36.022 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:36.088 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:38.515 TAU 4[50133:207] coleccionViewController->viewWillDisappear

第二次:

2010-08-17 10:30:44.171 TAU 4[50133:207] coleccionVista retain count0: 1
2010-08-17 10:30:44.173 TAU 4[50133:207] coleccionVista retain count1: 1
2010-08-17 10:30:44.174 TAU 4[50133:207] coleccionVista retain count2: 3
2010-08-17 10:30:44.176 TAU 4[50133:207] coleccionVista retain count3: 2
2010-08-17 10:30:44.241 TAU 4[50133:207] coleccionViewController->viewWillAppear
2010-08-17 10:30:52.332 TAU 4[50133:207] coleccionViewController->viewWillDisappear

我还有一条关于 dealloc 方法的 NSLog 消息没有显示。但是我注意到,如果我在另一个之后强制另一个 [coleccionVista 版本],则会显示 dealloc 消息,但在尝试 [super dealloc] 时会崩溃。我没有任何其他 coleccionViewController 的引用(我一直在代码中搜索,该方法的所有用法都在我向您展示的代码中)。

有什么想法吗?提前致谢!

【问题讨论】:

【参考方案1】:

最后我想我知道发生了什么。我已经更改了很多代码,所以我不确定,但似乎它是一个使用类 coleccionVista 的方法的 NSTimer,所以它正在维护类的引用,所以不可能释放它。

【讨论】:

【参考方案2】:

两个大问题:

NSLog(@"coleccionVista retain count0: %i",[coleccionVista retainCount]);
coleccionVista = [[coleccionViewController alloc] init];

大概coleccionVista 可能不为零,但您不会在分配新的之前释放它。这要么是泄漏,要么是崩溃。另请注意,-retainCount 返回 NSUInteger,而不是 int;使用 %i 对其进行格式化会调用未定义的行为(通常这只是在大端 64 位系统上打印错误的数字)。

[coleccionVista release];
NSLog(@"coleccionVista retain count3: %i",[coleccionVista retainCount]);

你正在发布一些东西。你不再拥有它。除非您知道其他人拥有它,否则使用它是不安全的。你可能想要[coleccionVista release]; coleccionVista = nil; 或者只是self.coleccionVista = nil,如果你已经把它变成了一个属性。

【讨论】:

以上是关于使用导航控制器弹出视图控制器时释放内存的问题的主要内容,如果未能解决你的问题,请参考以下文章

弹出导航控制器并选择选项卡?

不使用导航控制器时弹出视图控制器?

内存警告后的导航控制器堆栈问题

当视图控制器弹出或推入导航控制器堆栈时如何获得通知

从堆栈释放视图,带有导航控制器的标签栏

iOS 导航控制器获取弹出的视图控制器