1

据我了解 SDK 文档 UIViewController 的 navigationItem 生命周期绑定到控制器本身而不是控制器的视图。即在默认实现中,它是按需创建的,并与视图控制器一起销毁 - 具有所有内容,如按钮项和标题视图。鉴于按钮项和 titleView 都可以由 UIView 实例表示 - 这是否意味着一旦创建这些视图将保留在内存中,直到控制器被销毁并经历所有内存警告?

这个设计决策背后的意义是什么?对内存使用的影响是否被认为太小而无法打扰?对于到处使用自定义导航栏按钮/标题的应用程序来说,它真的很小吗?

很容易将一些 navigationItem 属性显式绑定到控制器的视图生命周期——比如在 -viewDidLoad 中设置 titleView 并将其放入 -viewDidUnload ( self.navigationItem.titleView = nil)。但 navigationItem 属性文档建议避免这种模式。除了给定的带有后退按钮的示例之外,还有其他潜在问题吗?

4

1 回答 1

0

添加了一个类别 (snippet2) 来跟踪保留计数和导航项的破坏,随意做同样的事情:) 似乎它没有被内存警告释放。一个解释来自于视图控制器不必与导航控制器一起使用的常识:这应该是为什么导航项添加了一个单独的类别(snippet1)并且它的生命周期必须用导航管理控制器,而不是视图控制器实例本身。

如果自定义导航项太重以至于您需要尽可能释放它,我将保留默认实现,添加自定义导航项类别并根据需要手动管理这些项目(再次通过覆盖所需的UINavigationController方法,如导航-控制器didReceiveMemoryWarning, pushViewController: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 回答