0

を使用しUIPopoverControllerて contentViewController を指定すると、contentViewController の割り当てを正しく解除できないようです (contentViewController.viewDidUnload が呼び出されないという事実から明らかなように)。

ポップアップを作成して表示するコード:

PopupTestViewController *popupTest = [[PopupTestViewController alloc] initWithNibName:@"PopupTestViewController" bundle:nil];
popupTest.mainViewController = self;
self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popupTest];
self.popoverController.popoverContentSize = popupTest.view.frame.size;
self.popoverController.delegate = self;
[self.popoverController presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

contentViewControllerここで、 (上記のコードでは、これはPopoverTestViewController)が閉じられたときに割り当てを解除する必要があると想定していますUIPopoverController(クリックしてオフにするか、明示的に閉じるか)。しかし、viewDidUnload呼び出されることはありません。ただし、 の dealloc メソッドを定義するPopoverTestViewControllerと、適切に呼び出されることに気付きました。

だから私の質問は:viewDidUnloadが呼び出されないのはなぜですか? (そして私はARCを使用しています)。

4

2 に答える 2

0

viewDidUnload呼び出される保証はありません。アプリケーションがメモリ警告を受信し、受信ViewControllerviewロードされたが画面外にある場合にのみ呼び出されます。がviewロードされ、保持カウントが 0 になると、viewDidUnloadは呼び出されません。

詳細については、ドキュメントを参照してください。どのオブジェクトをいつ解放するかについての指示は、同じドキュメントにあります。

于 2012-05-30T20:03:20.580 に答える
0

これは、私が使用したものとは少し異なりUIPopoverControllerます。手動でalloc'edpopupTestを実行したため、間違いなく手動で行う必要がありますreleaseUIPopoverControllerインスタンスは呼び出されたpopupTestときに保持されます。initWithContentViewController:

popoverControllerさらに、 でプロパティを定義している場合、から直接割り当ててセッターretainを使用すると、二重保持が発生します。a を設定する一般的なパターンは次のとおりです。self.popoverControlleralloc@property

@property (nonatomic, retain) Foo* foo;

...

Foo* aFoo = [[Foo alloc] init];
self.foo = aFoo;
[aFoo release];
于 2012-05-30T18:44:22.163 に答える