1
UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];

viewControllerをリリースしたい場合;

[viewController release];

viewControllerをリリースする前に手動でview1をリリースする必要がありますか?

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];
[viewController release];

私はこれをすべきですか?または単にviewControllerを解放しますか?

4

2 に答える 2

2

いいえ、そうする必要はありません。リリースするだけviewControllerで、すべてがsubviews内部的にリリースされます。残りはフレームワークによって処理されます。

ARCを使用していない場合、コードは次のようになります。

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];

[viewController release];

両方viewControllerview11回を割り当てたので、上記のように1回解放する必要があります。その後は何もしていませんので、再度リリースする必要はありませんretain

これを行うと、

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];

viewController2回リリースし、viewController'sサブビューも内部でリリースされるため、リリース時にクラッシュが発生することがほとんどです。

ここで注意しなければならないのは、 Appleのドキュメントに記載されているようにaddSubview保持することです。view1

追加するビュー。このビューは受信者によって保持されます。追加されると、このビューは他のサブビューの上に表示されます。

これはリリースされるとリリースさviewControllerれます。所有していないため、手動でリリースする必要はありません。

于 2012-12-24T10:21:34.917 に答える
1

これが正しい方法です。

UIViewController *viewController = [[UIViewController alloc] init];
UIView *view1 = [[UIView alloc] init];
[viewController.view addSubview:view1];
[view1 release];
[viewController release];

ビューをサブビューとして追加すると、ビューコントローラーによって保持されます。addサブビュー:

サブビューのレシーバーのリストの最後にビューを追加します。

- (void)addSubview:(UIView *)view

パラメーター

見る

The view to be added. This view is retained by the receiver. After being added, this view appears on top of any other subviews. 

討論

このメソッドはビューを保持し、次のレスポンダーを新しいスーパービューであるレシーバーに設定します。

ビューはスーパービューを 1 つだけ持つことができます。ビューに既にスーパービューがあり、そのビューがレシーバーでない場合、このメソッドはレシーバーを新しいスーパービューにする前に以前のスーパービューを削除します。

参照UIView

重要: ビュー コントローラーは、そのビューとそれが作成するすべてのサブビューの唯一の所有者です。これらのビューを作成し、ビュー コントローラー自体が解放されたときなどの適切なタイミングでそれらの所有権を放棄する責任があります。

参考:UIViewControllerクラス

UIView *view = (UIView *)[[viewController.view subviews] objectAtIndex:0];
[view release];

viewController で release を呼び出すと、必ずクラッシュします。

于 2012-12-24T10:26:17.353 に答える