在viewDidLoad中,init中设置的属性是否为nil?

时间:2012-09-20 19:56:12

标签: iphone ios cocoa-touch ios5

我遇到一个问题,派生类在其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项目中按预期工作,导入到我最终需要使用它的项目时失败。

2 个答案:

答案 0 :(得分:0)

您确定两次都是从同一个控制器登录吗?就像,也许你在一个控制器上调用initWithNibName:bundle:,但实际上在另一个控制器上调用了viewDidLoad

答案 1 :(得分:-1)

有没有理由将它设置为复制?

尝试将属性设置为:

@property (nonatomic, strong) NSString *myString;