0

我写了以下一段代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

GameViewController *gameViewController = [[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO];

NSLog(@"Retain Counter =%d",gameViewController.retainCount);

[navController pushViewController:gameViewController animated:YES];
[gameViewController release];

NSLog(@"Retain Counter=%d",gameViewController.retainCount);

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

两个日志的结果依次为16!这怎么可能?我只调用一次 alloc 方法并在将控制器压入堆栈后释放.. alloc-> +1, push-> +1, release-> -1 = 1 与否?

当我将视图控制器从堆栈中弹出时,我希望视图控制器被释放。

4

4 回答 4

6

请阅读此说明以明确此问题。它是NSObject 协议参考的一部分:

重要提示:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能在一个对象上保存了任何数量的延迟释放,所以您不太可能从中获得有用的信息方法

NSObject 协议参考。RetainCount 讨论

于 2012-03-04T13:09:27.790 回答
1

自动释放您的 GameController 创建,如下所示:

GameViewController *gameViewController = [[[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO] autorelease];

然后删除[gameViewController release];然后你的代码看起来很干净,并且gameViewController会在从导航堆栈中弹出后自动释放。不用担心retainCount- 当您推送视图控制器时,会根据UIKit需要接管并执行该操作。你只需要担心你的代码。实际上,您编写它的方式应该没问题,我只是认为我在这里的建议使代码更干净。retainrelease

除非您在 Instruments 中看到您的gameViewController对象存在内存泄漏,否则我认为您不必担心。

于 2012-03-04T12:58:23.897 回答
1

这是因为内部有一些保留(通过 pushViewController: 方法),你不应该检查保留计数,只检查你释放了你拥有的对象,特别是当你检查 sdk 调用方法之间的保留计数时。

于 2012-03-04T13:03:16.993 回答
0

你在 GameViewController 中使用 NSNotificationCenter 吗?可能是您将视图控制器作为观察者添加到 NotificationCenter 并增加了 retainCount。

于 2012-03-04T13:16:41.593 回答