在现有View中弹出一个新视图时EXC_BAD_ACCESS

时间:2013-01-22 09:30:58

标签: objective-c uiviewcontroller uiviewanimation

我正在尝试在现有视图中调用新视图

TransactionFinish *childView= [[TransactionFinish alloc] initWithNibName:@"TransactionFinish" bundle:nil];

        childView.view.frame = self.view.frame;

        childView.view.frame=CGRectMake(10, 10, self.view.frame.size.width-20, self.view.frame.size.height-20);
        childView.view.alpha = 0.0f;
        [self.view addSubview:childView.view];

        [UIView animateWithDuration:0.5 delay:0.0 options:UIViewAnimationCurveEaseOut
                         animations:^{
                             childView.view.alpha = 1.0f;
                         }
                         completion:^(BOOL finished) {
                         }];

它位于ViewDidLoad()的{​​{1}}内(我已经尝试过调试它)但是它给了我带绿色的线程TransactionFinish

1 个答案:

答案 0 :(得分:1)

问题在于childView的生命周期。您将对它的引用实例化并存储到局部变量中:

TransactionFinish *childView= [[TransactionFinish alloc] initWithNibName:@"TransactionFinish" bundle:nil];

如果您使用ARC,当局部变量超出范围时,它所引用的对象(childView)将被释放。

如果你不使用ARC,我想你正在做:

[childView release];

某处可以避免childView被泄露(因为上面粘贴的代码会暗示)。

任何一个假设都可以解释为什么会发生崩溃:当调用viewDidLoad时,控制器已被解除分配。

childView视图添加到self.view

    [self.view addSubview:childView.view];

将保留childView.view但不保留childView。所以控制器被释放,而它的视图不是。

对此的修复是在您的类中创建strong属性以存储对childView控制器的引用:

@property(nonatomic, strong) TransactionFinish *childView;

另一种可能性是使用controller containment;你可以做点什么吗

[vc willMoveToParentViewController:self];
[self addChildViewController:childView];
[self.view addSubview:childView.view]; // or something like this.
[childView didMoveToParentViewController:self];

但这只适用于iOS5 +。