Скорее всего, вам нужно обнулить переменную экземпляра tableDataDictionary. В противном случае при первом запуске каждого из этих методов он будет работать нормально, но во второй раз tableDataDictionary не будет иметь значение nil и будет указывать на указатель dealloc'd; таким образом, вызов alloc не будет выполнен, и при вызове viewWillDisappear: он попытается снова освободить этот указатель. Итак, чтобы исправить это:
<pre>
-(void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[mainTableView deselectRowAtIndexPath: [mainTableView indexPathForSelectedRow] animated:NO];</p>
<pre><code>[tableDataDictionary release];
tableDataDictionary = nil;
}