我写了以下代码:
-(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];
}
两个日志的结果按顺序 1 和 6 ! 这怎么可能?我只调用一次alloc方法并在将控制器推到堆栈后释放.. alloc-> +1,push-> +1,发布 - > -1 = 1还是不?
当我将视图控制器从堆栈中弹出时,我希望视图控制器被释放..
答案 0 :(得分:6)
请在此问题中阅读此说明。它是 NSObject协议参考:
的一部分重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象 可能保留了一个对象 以便保存对它的引用,而同时自动释放池可能会持有任意数量的延迟版本对象, 您不太可能从此方法中获取有用的信息 。
答案 1 :(得分:1)
自动发布您的GameController创建,如下所示:
GameViewController *gameViewController = [[[GameViewController alloc]initWithLevelNumber:([levelGroup intValue]*100+indexPath.row) Bonus:NO] autorelease];
然后删除[gameViewController release]
;然后你的代码看起来像犹太人,gameViewController
将从导航堆栈弹出后自动释放。不要担心retainCount
- 推送视图控制器时,UIKit
会接管并根据需要retain
/ release
。你只需要担心你的代码。实际上,你写它的方式应该没问题,我只是认为我的建议使代码更清晰。
除非您在仪器中看到您的gameViewController
对象有内存泄漏,否则我认为您无需担心。
答案 2 :(得分:1)
这是因为内部有一些保留(通过pushViewController:方法),你不应该检查保留计数,只检查你释放你拥有的对象,特别是当你检查sdk调用方法之间的保留计数时。
答案 3 :(得分:0)
你在GameViewController中使用NSNotificationCenter吗? 可能是您将视图控制器作为观察者添加到NotificationCenter,它会增加retainCount。