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 に答える