0

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

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()TransactionFinish我尝试过调试它),但它给了我EXEC_BAD_ACCESS(code=1,address=0x31f54e62)绿色的线程

4

1 回答 1

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;

另一种可能性是使用控制器遏制;你可以做点什么

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

但这仅适用于 iOS5+。

于 2013-01-22T09:43:38.497 回答