1

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

4

2 回答 2

0

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

于 2012-09-20T20:25:05.097 回答
-1

您有什么理由将其设置为复制吗?

尝试将属性设置为:

@property (nonatomic, strong) NSString *myString;
于 2012-09-20T20:04:03.927 回答