2013-03-13 148 views
0

我有与UIViewPicker这样打开UIViewController一个视图控制器:BAD_ACCESS上的导航项目点击

-(void)operationClicked:(id)sender { 
    ChoseOperationViewController *picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]]; 
    [self.view addSubview:picker.view]; 
    [picker animateSlideOut]; 
} 

ChoseOperationViewController是定制与持有UiViewPickerUINavigationBar

我连“Anuluj笔尖UIViewController类“(取消)按钮的动作,如下图所示: enter image description here

当我cli CK上的按钮我得到了-[ChoseOperationViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x7569fd0和cancelClicked方法不beeing叫。这是为什么?

+0

出现错误时在控制台上打印什么? – nsgulliver 2013-03-13 15:13:42

+0

没有......它只是BAD_ACCESS – 2013-03-13 15:16:58

+0

使僵尸,看看这是你应该运行在仪器的僵尸工具模拟器发生什么消息出现 – nsgulliver 2013-03-13 15:18:43

回答

0

问题:

-(void)operationClicked:(id)sender { 
    ChoseOperationViewController *picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]]; 
    [self.view addSubview:picker.view]; 
    [picker animateSlideOut]; 
} 

这将创建ChoseOperationViewController一个实例,并添加它的视图作为子视图self.view。但是当方法-(void)operationClicked:(id)sender返回时,您没有强有力的参考您刚刚创建的实例 - 因此ARC会将其解除分配。

当用户触摸取消按钮,它会尝试将邮件发送到被释放的实例和应用程序崩溃。

解决方案:

一个实例变量添加到您的UIViewController

@implementation MyViewController { 
    ChoseOperationViewController *picker; 
} 

operationClicked改变你的代码:

-(void)operationClicked:(id)sender { 
    if(!picker) { 
     picker = [[ChoseOperationViewController alloc] initWithNibName:@"ChoseOperationViewController" bundle:[NSBundle mainBundle]]; 
     [self.view addSubview:picker.view]; 
    } 
    [picker animateSlideOut]; 
} 

这将防止ChoseOperationViewController实例将从解除分配