1

メインのviewController内に、次のように宣言された2つのivarがあります。

UIPopoverController* __popoverController;
HPSQuestionnaireEditorController* _questionnaireEditorController;

次に、UIPopOverを次のように表示します。

_questionnaireEditorController = [ [ HPSQuestionnaireEditorController alloc ] initWithNibName:nil bundle:nil ];
__popoverController.delegate = self;
[__popoverController setPopoverContentSize:CGSizeMake(400, 500)];
[_questionnaireEditorController setContentSizeForViewInPopover:CGSizeMake(400, 500)];
[__popoverController presentPopoverFromRect:editWrapper.frame inView:editWrapper.superview permittedArrowDirections:UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionRight animated:YES ];

ポップオーバーを却下するときが来たら、次のように手動でこれを行います。

[__popoverController dismissPopoverAnimated:YES ];
__popoverController = nil;
_questionnaireEditorController.view=nil;
_questionnaireEditorController=nil;

ARCを使用しています。

_questionnaireEditorController内には、次のものがあります。

- (void)viewWillUnload
{
    NSLog(@"HPSQuestionnaireEditorController viewWillUnload starting");
}

ただし、これは実行されません。ポップオーバーの却下は、ビューまたはビュー内でホストされているコントローラーを実際にアンロードするようには見えません。

私は何が間違っているのですか?ありがとう。

4

2 に答える 2

1

あなたは何も悪いことをしていません。UINavigationControllers、UIPopoverControllers、およびUITabBarControllersは、画面外のときにビューをアンロードする必要はありません。それらには、絶対に不要になるか、メモリが必要になるまで保持するキャッシュバックエンドがあります。

アンロードする必要がない場合は、問題ありません。ご心配なく。

于 2012-08-17T14:10:33.990 に答える
1

viewWillUnload(およびviewDidUnload)は、ビューコントローラの割り当てが解除されたときに必ずしも呼び出されるとは限りません。通常、これらはメモリ警告に応答してのみ呼び出されます。UIViewControllerリファレンスによると、両方のメソッドの説明では、次のようになります。

低メモリ状態が発生し、現在のView Controllerのビューが不要な場合、システムはそれらのビューをメモリから削除することを選択する場合があります。

重要なクリーンアップがある場合は、deallocで実行します。クリーンアップが保持されたプロパティをnilに設定するだけで構成されていて、ARCを使用している場合は、deallocを気にする必要はありません。

于 2012-08-17T14:18:49.293 に答える