我遇到了一个问题,派生类在其 initWithNibName 调用中设置了超类中定义的属性,并且在调用 viewDidLoad 时,该属性再次神奇地未定义。它类似于:
@interface BaseClassController : UIViewController
{
}
@property (copy, nonatomic) NSString *myString; // synthesized in the .m
在另一个文件中
@interface DerivedClassController : BaseClassController
{
}
并在其实施中:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
NSLog(@"Setting MyString stuff");
self.myString = @"Hi Mom";
NSLog(@"Done setting myString");
}
return self;
}
- (void)viewDidLoad
{
NSLog(@"MyString is %@", self.myString); // output as (null)!!!
[...]
}
根据 NSLog 的输出顺序是正确的,我知道 viewDidLoad 没有被首先调用:首先是 initWithNibName 方法,然后是 viewDidLoad。viewDidLoad 每次都将 self.myString 报告为 (null)。但是,如果我将 myString 的初始化下移到 viewDidLoad,一切正常。为什么?我必须在这里遗漏一些非常明显的东西..
编辑:
不确定这是否会有所不同,但 DerivedClassController 是导航控制器的根视图控制器,它以模态方式呈现(出于各种遗留原因)。
编辑2:
该代码在独立的 xcode 项目中按预期工作,当导入到我最终需要使用它的项目中时它会失败。