ios5 上的dismissViewControllerAnimated 崩溃

Posted

技术标签:

【中文标题】ios5 上的dismissViewControllerAnimated 崩溃【英文标题】:dismissViewControllerAnimated crash at ios5 【发布时间】:2012-08-06 17:22:34 【问题描述】:

代码会因为循环引用而崩溃吗?

MenuController: UIViewController

- (id)initWithNibName:
...
TabsController *tabs = [[TabsController alloc] initWithNibName:@"TabsController" bundle:nil];
self.tab = tabs;
....


//button pressed:
- (IBAction)showPrefFromMenu:(id)sender 
    // todo change delegate!?
     tab.tabDelegate = self;
    [self presentModalViewController:tab animated:YES];
    //[tab release];


// delegate method:
 -(void)myViewDismissed 
    .... 
    NSLog(@"tab references: %d", [tab retainCount]) ;

    [self dismissModalViewControllerAnimated:YES];//crash       
     ...


模态/子类:

TabsController : UIViewController <...>

- (IBAction)dismissTabs:(id)sender 
      ...
    NSLog(@"dismissTabs: sender: %@",sender);
    [self.tabDelegate myViewDismissed];    

我看到 self.tabDelegate 是 MenuController 实例,并且在该代码上想要关闭并释放 TabsController。

虽然在 [self.tabDelegate myViewDismissed] 之后不再是代码;但是如果它不能执行,因为它被释放了,也许程序集 Ret 或者什么指令不能执行?返回语句。

我会尝试分离委托还是有更好的解决方案?

编辑: 崩溃是典型的:EXC_BAD_ACCESS(code=1,address=090) 大会看起来像这样: ldr r1, [r4, r0]

编辑2: 修改了一点代码,因为在模拟器 4.3 中不会崩溃,但在 5.0 时会崩溃,现在这里是当前代码:

- (IBAction)showTab:(id)sender 

    tab.tabDelegate = self;

    if (SYSTEM_VERSION_LESS_THAN(@"5.0")) 
        [self presentModalViewController:tab animated:YES];
    
    else
        NSLog(@"Executing presentViewController (ios>= 5.0)");
        [self presentViewController:tab animated:true completion: nil];
    




 -(void)delegateCallback 

     if (SYSTEM_VERSION_LESS_THAN(@"5.0")) 
         [self dismissModalViewControllerAnimated:NO]; 
     
     else
         NSLog(@"Executing dismissViewControllerAnimated (ios>= 5.0)");
         [self dismissViewControllerAnimated:TRUE completion: nil];//crash
             


Edit3 截图:

UIWindowController transition:fromViewController:toViewController:didEndSeelctor 行崩溃,原因是:没有 parentViewController: https://devforums.apple.com/message/451045 伙计们在这里找到了解决方案,:https://github.com/ideashower/ShareKit/issues/254 但在 NDA 下

编辑解决了 ios 5.0+ 重新写入 PushviewController 一个完整的链接:https://***.com/a/7767767/529543

- (IBAction)presentViewController:(id)sender 


    tab.tabDelegate = self;

    if (SYSTEM_VERSION_LESS_THAN(@"5.0")) 
        [self presentModalViewController:tab animated:FALSE];
    
    else
        NSLog(@"Executing presentViewController (ios>= 5.0) [tab retainCount]: %d " ,[tab retainCount]);       

    // store parent view to able to restore the state:
    parentView = self.view.superview;        

    // init a navigation controler and set up:
    navigationController=[[UINavigationController alloc] initWithRootViewController:self];                
    [self.view removeFromSuperview];

    [myAppDelegate.window addSubview:navigationController.view];   ///appDelegate is delegate of ur Application     

    navigationController.navigationBar.hidden =true;

    [navigationController pushViewController:tab animated:YES];       


然后弹出:

-(void)infoViewDismissed 

     if (SYSTEM_VERSION_LESS_THAN(@"5.0")) 

         [self dismissModalViewControllerAnimated:NO];  
     
     else
         NSLog(@"Executing dismissViewControllerAnimated (ios>= 5.0) ");

         [navigationController popToRootViewControllerAnimated:false];        

         [navigationController.view removeFromSuperview];

         [parentView addSubview:self.view];

          

我已经解决了我的问题,在一个非常丑陋的模式下,但功能正常......还被告知放弃对 ios3 的支持 :) 我根本不喜欢在运行时切换 GUI 架构。

【问题讨论】:

【参考方案1】:

你的问题有点难以理解,但我猜你有一个保留周期:

ObjectA retains ObjectB
ObjectB retains ObjectA

两个对象都没有被释放?

您的 tabDelegate 属性应为:

@property (nonatomic, assign) id tabDelegate;
//                    ^^^^^^-This is the important bit, this stops the retain cycle.

【讨论】:

我有/有:@property (assign) id tabDelegate;添加非动画,没有帮助,但谢谢 改为保留,但也没有帮助我 保留不适合与委托模式一起使用。你在使用 ARC 吗? 在这个项目中没有使用 ARC。 Emable zoombies 也对我没有帮助,这是已释放的对象。选项卡栏有选项卡...我在其中一个选项卡中的 aftaif 内存管理错误,可能有一个已释放的对象,但是这些选项卡上有数百个对象,ivars...【参考方案2】:

如果没有更多信息就很难说(您是否使用 ARC,您是否保留/分配了委托等...),但根据 iOS 文档,您也使用了已弃用的 modalview 方法。可能值得一试:

[self presentViewController:tab animated:YES completion:NULL];

[self dismissViewControllerAnimated:YES completion:NULL];

【讨论】:

谢谢,它被标记为将被弃用,现在不是。也不会改变行为,它会崩溃。我很感激帮助我的努力,这就是为什么我用 UP 标志标记。购买不会改变。 啊好的。根据您上次的编辑,我看到问题是错误的访问错误您是否在代码中的其他任何地方调用 TabsController 上的发布? XCode 在使用“Product”>“Analyze”时会给你任何消息吗? xcode 分析,它说大约有 45 次泄漏,但我不能相信那个报告,尽管它可以作为一个起点 哦,哇,泄漏太多了。尽管分析可能无法在您的应用程序中找到所有内容,但它指出 45 个泄漏的事实非常令人担忧。我建议花更多时间查看苹果文档阅读内存管理,然后重新编写应用程序 如果分析器显示有 45 次泄漏,则您的内存管理已损坏。毫不奇怪你有一个过度释放。首先修复分析器警告,然后调试剩余的内存问题。分析仪绝对值得信赖。

以上是关于ios5 上的dismissViewControllerAnimated 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

未调用dismissViewController 完成处理程序

将dismissViewController 与UIAlertController 一起使用

dismissViewController 或 popViewController 都不起作用

为 DismissViewController 添加通知而不进行子类化

ios调用dismissViewController的一个小陷阱

iOS5 上的 UIGestureRecognizerDelegate 和手势