关闭模态视图控制器后自动释放崩溃
Posted
技术标签:
【中文标题】关闭模态视图控制器后自动释放崩溃【英文标题】:Autorelease crash after dismissing modal view controller 【发布时间】:2012-06-02 16:57:37 【问题描述】:我正在使用以下代码 (http://***.com/questions/4471289/how-to-filter-nsfetchedresultscontroller-coredata-with-uisearchdisplaycontroll) 创建的模态视图控制器中显示一个表格视图,以便我可以使用 Core数据、NSFetchedResults 和 UISearchbar。我终于在表格视图/搜索/详细视图结束时一切正常,但我刚刚发现了一个我似乎无法弄清楚的阻碍。
当我使用以下方式关闭 tableview 时:
- (IBAction)doneButtonPressed:(id)sender [self dismissModalViewControllerAnimated:YES];
模式视图关闭,主视图加载,然后应用程序崩溃。它已经够远了,我可以从主视图控制器调用这个 nslog:
-(void) viewDidAppear:(BOOL)animated NSLog(@"do I crash");
我在这里遇到了错误的访问错误:
int main(int argc, char *argv[])
@autoreleasepool
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
我相信这些问题可能与弧有关。我用的代码模板不是arc的,所以做了如下改动:
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain, readonly) NSFetchedResultsController *fetchedResultsController;
到
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong, readonly) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *searchFetchedResultsController;
@property (nonatomic, retain) UISearchDisplayController *mySearchDisplayController;
到
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, strong) NSFetchedResultsController *searchFetchedResultsController;
@property (nonatomic, strong) UISearchDisplayController *mySearchDisplayController;
另外,我从 didreceivememorywarning 中删除了以下内容:
[fetchedResultsController_ release];
[searchFetchedResultsController_ release];
并更改了以下内容 - (NSFetchedResultsController *)fetchedResultsController
return [[fetchedResultsController_ retain] autorelease];
到
return fetchedResultsController;
并在 - (NSFetchedResultsController *)searchFetchedResultsController
return [[searchFetchedResultsController_ retain] autorelease];
到
return searchFetchedResultsController;
我完全被难住了。任何帮助将不胜感激!
【问题讨论】:
好的,奇怪的附加信息...如果我激活搜索然后取消搜索(我什至不必输入任何内容),应用程序会关闭模态视图控制器而不会崩溃。如果我不使用搜索栏,它会 100% 崩溃。很明显,当搜索被激活时正在设置一些东西来修复自动释放池问题,但我不知道它是什么! 另外,当我用僵尸仪器运行时,它根本不会崩溃(即使没有先激活搜索) 所以,在做了更多的僵尸研究之后,我想知道这是否不是发布问题错误(nszombie enabled 不会在调试器中记录任何内容)。也许这是一个内存损坏问题。我仍然不确定如何开始解决.... 【参考方案1】:嗯,问题解决了。我无法想象我是第一个或最后一个遇到此问题的人,所以如果您遇到类似的困难......
在搜索了搜索代码之后(我认为它必须与此有关,因为如果我在关闭模态视图之前进行搜索,它不会崩溃),我仍然找不到任何错误。
然而,我意识到我正在以编程方式创建我的 searchBar 和 searchDisplayDelegate。一时兴起,我决定在故事板中创建 searchBar 和 displayDelegate,然后将它们链接起来。添加后,我从 loadView 中注释掉:
// UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 44.0)];
// self.mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
此外,在情节提要中添加它们会在 viewDidUnload 中自动创建以下内容:
[self setSearchBar:nil];
[self setMySearchDisplayController:nil];
维奥拉!没有更多的崩溃......我认为这只是 mySearchDisplayController 没有正确卸载。希望对其他人有所帮助!
【讨论】:
以上是关于关闭模态视图控制器后自动释放崩溃的主要内容,如果未能解决你的问题,请参考以下文章