2

ViewControllersビューをsubViewとして別のViewControllerに追加しています。

例 :

FirstScreenビューコントローラでこれを行います。

         [self.view addSubview:self.secondScreen.view]; 

そして、FirstScreenから削除したら、これを行います

         [self.secondScreen.view removeFromSuperView];
          self.secondScreen=nil;  

ただし、subViewの追加中にViewDidLoadメソッドが呼び出されますが、removeFromSuperViewViewDidUnLoadは呼び出されません。

私の質問

1)インスタンスself.secondScreenをnilに設定すると、secondScreen内のすべてのオブジェクトの割り当てが解除されますか

2)リークやメモリ警告が発生しないように、このようにすると安全ですか?

4

2 に答える 2

2

アプリがiOS5.0以降をサポートしていると仮定すると、次のように追加する必要があります。

[self addChildViewController:self.secondScreen];
[self.view addSubview:self.secondScreen.view]; 

removeFromParentViewController同様に、削除する場合は、スーパービューを使用してから削除できます。ここでアップルのドキュメントを確認してください。

ViewDidUnLoadiOS 6.0以降では非推奨になり、呼び出されません。こちらのドキュメントを確認してください。

ご質問については、

1)インスタンスself.secondScreenをnilに設定すると、secondScreen内のすべてのオブジェクトの割り当てが解除されますか

クラスをself.secondScreen終了すると、nilに設定すると、このクラス内のオブジェクトの解放が開始されます。ARCを使用している場合は、リリースについてあまり心配する必要はありません。OSがそれらを処理します。

2)リークやメモリ警告が発生しないように、このようにすると安全ですか?

はい、ARCを使用している場合はこれで問題ありません。非ARCの場合、このクラスですべての変数を適切に解放したことを確認する必要があります。その場合、保持/解放がすべてバランスが取れていることを確認してください。

于 2012-12-10T08:07:46.303 に答える
0

ViewDidUnloadは、ビューがViewControllerから削除されたときに呼び出されるのではなく、ビューがメモリからアンロードされたときに呼び出されます。これに関するiOSのドキュメントには、次の注意事項があります。

コントローラのビューがメモリから解放されたときに呼び出されます。(iOS 6.0では非推奨です。メモリが少ない状態でビューがパージされなくなったため、このメソッドが呼び出されることはありません。)

「非推奨」と「このメソッドは呼び出されない」という事実に注意してください。

于 2012-12-10T08:07:36.517 に答える