关闭模态视图控制器后自动释放崩溃

Posted

技术标签:

【中文标题】关闭模态视图控制器后自动释放崩溃【英文标题】:Autorelease crash after dismissing modal view controller 【发布时间】:2012-06-02 16:57:37 【问题描述】:

我正在使用以下代码 (http://***.com/questions/44712​​89/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 没有正确卸载。希望对其他人有所帮助!

【讨论】:

以上是关于关闭模态视图控制器后自动释放崩溃的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器关闭时应用程序崩溃

UIViewController 在解除先前呈现的模态视图控制器后被释放

呈现模态视图控制器时 iPhone 崩溃

关闭模态视图后的状态栏和导航栏问题

关闭模态视图控制器后呈现不同的视图控制器

关闭模态视图控制器后在根视图控制器中执行操作