1

以下のコードを使用して、ParentViewController のビュー内に ChildViewController を表示する必要がある iPad アプリケーションを作成しています。

- (void)viewDidLoad
{
   FavViewController *aViewController = [[FavViewController alloc] initWithNibName:@"FavViewController" bundle:nil];
   [self.mainView addSubview:aViewController.view];
   [super viewDidLoad];
}

これが親ビューfavViewControllerに読み込まれると、self.MainViewchildViewController 内のすべてのコントロールが正常に表示されますが、UIButton をクリックするとアプリがクラッシュします。以下はクラッシュのログです。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSConcreteMapTable myAction:]: unrecognized selector sent to instance 0x8093170' *** First throw call stack: (0x1733012 0x1558e7e 0x17be4bd 0x1722bbc 0x172294e 0x156c705 0x4a02c0 0x4a0258 0x561021 0x56157f 0x560222 0x4cfb1d 0x4cff02 0x4add4a 0x49f698 0x25fddf9 0x25fdad0 0x16a8bf5 0x16a8962 0x16d9bb6 0x16d8f44 0x16d8e1b 0x25fc7e3 0x25fc668 0x49cffc 0x255d 0x2485 0x1) libc++abi.dylib: terminate called throwing an exception

4

1 に答える 1

3

これは、 の誤用によって引き起こされるメモリ管理のバグですUIViewControllers

FavViewController作成された-viewDidLoadは保持されないため、そのメソッドを離れるとすぐに割り当てが解除されます。

コントローラーを使用してビューを作成し、そのビュー内のコントロールからコントロールにアクションをバインドし、コントローラーを破棄できるようにしてから、ボタンをタップしてそれらのアクションの 1 つを起動しようとしました。

表示されるエラーは、 のインスタンスがNSConcreteMapTable、かつてFavViewController.

UIViewControllerさらに、そのようなサブクラスに属するビューを任意にネストしないことが期待されます。そうする必要がある場合は、「コンテナー ビュー コントローラー」メソッドを使用して、それらの子コントローラーを管理する必要があります。- addChildViewController:親View Controllerが子Controllerへの参照を保持するようになり、割り当てが解除されないため、これらの方法の1つであり、たまたま問題を解決します。

于 2013-03-09T17:12:14.990 に答える