1

SDK ドキュメントを理解している限り、UIViewController の navigationItem ライフサイクルは、コントローラーのビューではなく、コントローラー自体にバインドされています。つまり、デフォルトの実装では、ボタン項目や titleView などのすべてのコンテンツとともに、オンデマンドで作成され、View Controller で破棄されます。ボタン項目と titleView の両方が UIView インスタンスによって表される可能性があることを考えると、これらのビューは一度作成されると、コントローラーが破棄され、すべてのメモリ警告が表示されるまでメモリに残るということですか?

この設計上の決定の背後にある意味は何ですか? メモリ使用量への影響は小さすぎると考えられますか? カスタマイズされたナビゲーション バー ボタン/タイトルをあらゆる場所で使用しているアプリケーションにとって、それは本当に小さいのでしょうか?

-viewDidLoad で titleView を設定し、-viewDidUnload ( self.navigationItem.titleView = nil) でドロップするように、navigationItem プロパティの一部をコントローラのビュー ライフサイクルに明示的にバインドするのは簡単です。しかし、navigationItem プロパティのドキュメントでは、このパターンを避けるよう提案しています。戻るボタンを使用した例以外に、潜在的な問題はありますか?

4

1 に答える 1

0

保持カウントとナビゲーション アイテムの破棄を追跡するためのカテゴリ (snippet2) を追加しました。お気軽に同じことを行ってください :) メモリ警告で割り当てが解除されていないようです。説明は、View Controller を Navigation Controller と一緒に使用する必要がないという常識から来ています。それが、nav-item が別のカテゴリ (snippet1) で追加され、そのライフサイクルを nav- で管理する必要がある理由です。ビュー コントローラ インスタンス自体ではありません。

カスタム nav-items が非常に重いため、可能な限りリリースする必要がある場合は、デフォルトの実装をそのままにして、カスタム nav-items カテゴリを追加し、必要に応じてこのアイテムを手動で管理します (nav-item などの必要なUINavigationControllerメソッドをオーバーライドすることによって)。コントローラdidReceiveMemoryWarningpushViewController:animated:popViewControllerAnimated:animated:)。しかし、本当に必要なときにそのようなケースは想像できません。

スニペット 1

@interface UIViewController (UINavigationControllerItem)

@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; // Created on-demand so that a view controller may customize its navigation appearance.
@property(nonatomic) BOOL hidesBottomBarWhenPushed; // If YES, then when this view controller is pushed into a controller hierarchy with a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.
@property(nonatomic,readonly,retain) UINavigationController *navigationController; // If this view controller has been pushed onto a navigation controller, return it.

@end

スニペット 2

@implementation UINavigationItem (Logs)


- (id)init
{
    NSLog(@"I'm initialized (%@)", [self description]);
    self = [super init];
    return self;
}

-(void) release
{
    NSLog(@"I'm released [%d](%@)", [self retainCount], [self description]);
    [super release];
}

-(void) dealloc
{
    NSLog(@"I'm deallocated [%d](%@)", [self retainCount], [self description]);
    [super dealloc];
}

@end
于 2012-05-21T01:37:55.277 に答える