UIViewController pushViewController高保留View控制器的数量

时间:2012-03-04 12:51:00

标签: objective-c ios uinavigationcontroller pushviewcontroller retaincount

我写了以下代码:

-(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还是不?

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

4 个答案:

答案 0 :(得分:6)

请在此问题中阅读此说明。它是 NSObject协议参考

的一部分

重要说明:此方法在调试内存管理问题时通常没有价值。因为任何数量的框架对象 可能保留了一个对象 以便保存对它的引用,而同时自动释放池可能会持有任意数量的延迟版本对象, 您不太可能从此方法中获取有用的信息

NSObject Protocol Reference. RetainCount discussion

答案 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。