我遇到一个问题,派生类在其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项目中按预期工作,导入到我最终需要使用它的项目时失败。
答案 0 :(得分:0)
您确定两次都是从同一个控制器登录吗?就像,也许你在一个控制器上调用initWithNibName:bundle:
,但实际上在另一个控制器上调用了viewDidLoad
?
答案 1 :(得分:-1)
有没有理由将它设置为复制?
尝试将属性设置为:
@property (nonatomic, strong) NSString *myString;