1

ビューコントローラーのサブクラスがあります。このView Controllerのビューを別のビューに追加した後、のビューとのやり取りMyViewControllerによりクラッシュが発生します。ゾンビを実行すると、ダブル リリースが表示され、保持カウントがmyViewController-1 になりました。

alloc保持カウントを 1 にする必要があるこのオブジェクトを呼び出しています。またmyViewcontroller、保持カウントを 2 にする必要がある別のビューに のビューを追加しています。これはARCでのみクラッシュします

- (void)viewDidLoad {
   [super viewDidLoad];

   MyViewcontroller *myViewcontroller = [[MyViewController alloc] init];
   [self.view addSubview:myViewcontroller.view];
}
4

1 に答える 1

5

ここには「二重」リリースはなく、1 つだけです。

ここでは、View Controller をローカル変数に格納しています。このメソッドが終了すると、ARC はそれを正しく解放します。そうしないと、参照がなくなるため、リークが発生します。*

また、ビューを別のビューに追加するとmyViewcontroller、保持カウントが 2 になります。

いいえ; コントローラではなく、ビューaddSubview:の所有権を取得します。ビュー自体は後でまだ生きていますが、コントローラーは生きていません。


*興味深いことに、これは MRR ではクラッシュしませんが、正しくありません。

于 2012-06-28T19:49:26.030 に答える