iOS开发:NavigationItem引用为何初始化后变为nil?
问题分析与解决方案
嘿,刚接触iOS和Objective-C遇到这种问题太正常了,我来帮你一步步理清~
问题根源
你遇到的NavigationItem引用变nil的情况,大概率是这几个原因:
- 只声明了
navItem属性,但没有正确初始化并关联到你的UINavigationBar - 混淆了UIViewController自带的
navigationItem和自己手动声明的属性(手动添加导航栏时,系统自带的navigationItem不会自动绑定到你创建的导航栏) - 如果是MRC环境(代码里用了
retain),可能存在内存管理问题,对象被提前释放导致引用为空
修正后的代码示例
我帮你调整了代码,同时标注了关键注意点:
@interface ContainerViewController() @property (nonatomic, retain) UINavigationBar *nav; // 除非有特殊需求,否则不需要手动声明navItem属性 @end @implementation ContainerViewController - (instancetype)initWithParams:(NSDictionary *)params { self = [super init]; if (self) { // 1. 初始化导航栏,设置正确的frame self.nav = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)]; // 2. 初始化导航项,设置标题等内容 UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:@"我的页面"]; // 可选:添加左侧按钮 UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(leftBtnTap)]; navItem.leftBarButtonItem = leftBtn; // 3. 将导航项绑定到导航栏,这一步是关键! [self.nav setItems:@[navItem] animated:NO]; // 4. 把导航栏添加到视图中 [self.view addSubview:self.nav]; // 如果需要保留navItem的引用,直接赋值即可(记得MRC下要retain) // self.navItem = navItem; // [navItem release]; // MRC环境下需要释放局部变量 } return self; } - (void)leftBtnTap { NSLog(@"左侧按钮被点击"); } // MRC环境下记得在dealloc中释放资源 - (void)dealloc { [_nav release]; // 如果手动声明了navItem,也要释放 // [_navItem release]; [super dealloc]; } @end
额外建议
- 优先使用ARC:现在iOS开发几乎都用自动引用计数(ARC)了,不用手动写
retain和release,能减少很多内存问题。如果你的项目还在MRC,可以考虑迁移到ARC。 - 尽量用UINavigationController:如果你的页面需要导航栏,推荐用
UINavigationController包裹你的ViewController,系统会自动帮你管理导航栏和navigationItem,不需要手动创建导航栏,省心很多。
内容的提问来源于stack exchange,提问作者hej
相关产品推荐
相关产品推荐

