我有一个表视图,当选择一个单元格时,它将视图控制器推送到导航堆栈上:
SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];
SAPPost TableViewController 有一个静态表视图,它及其单元格是从 nib 加载的。
我已经覆盖了initWithNibName:bundle:
method:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
self.sections = [NSMutableDictionary dictionary];
}
return self;
}
sections
是保留财产。
In viewDidLoad
of SAPostTableViewController
我有这个:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cellVisibiltyChanged:) name:@"SAStaticCellVisibiltyChanged" object:nil];
}
所以要匹配viewDidUnload
:
- (void)viewDidUnload
{
[super viewDidUnload];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"SAStaticCellVisibiltyChanged" object:nil];
}
但是,当我按下导航栏中的后退按钮(所有标准行为,无覆盖)并且SAPostTableViewController
被弹出,它不调用viewDidUnload
or dealloc
。所以这意味着如果我重新选择推动的单元格SAPostTableViewController
它创建了一个新实例SAPostTableViewController
来回重复此操作仅意味着内存使用量随着弹出的内容而不断增加SAPostTableViewController
永远不会被释放。 (我通过在分配上运行 Instruments 知道这一点)
奇怪的是,如果我释放 SAPPost TableViewController 两次,那么它就会按我的预期工作:
SAPostTableViewController *postViewController = [[SAPostTableViewController alloc] initWithNibName:NSStringFromClass([SAPostTableViewController class]) bundle:nil];
postViewController.site = site;
[self.navigationController pushViewController:postViewController animated:YES];
[postViewController release];
[postViewController release];
(如果我添加第三个发布声明,它就会像我预期的那样崩溃,只需要 2 个)
我已经求助于使用retainCount
并逐步执行在上面代码的第一行中执行的代码行,retainCount 保持为 1。它在第一行和第二行之间跳转,所以我看不到任何地方它被保留了额外的时间?
SAPostTableViewController 只用在这个地方,它不是任何东西的委托,也没有委托。
我怎样才能找到解决办法,还是我错过了一些简单的事情?
Here is what Instruments shows after pushing SAPostTableViewController just once (with only one release statement):
And what it shows after navigating back and forth repeatedly (again, one release statement):