在iPhone应用程序中设置属性时的奇怪行为

时间:2011-02-02 17:56:47

标签: iphone

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    PushOnStackViewController *vc = [[PushOnStackViewController alloc] init];
    vc.key = [self.keys objectAtIndex:[indexPath row]];

    [self.navigationController pushViewController:vc animated:YES];
}

在PushOnStackViewController类的init方法中我有

- (id)init {    
    self.navigationItem.title = key;

    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"texts" ofType:@"plist"]];
    self.keys = [dict objectForKey:key];
    [dict release];

    NSLog(@"%@", self.key);
    NSLog(@"%i", [self.keys count]);

    return self;
}

但为什么我不能访问self.key?它返回null,即使它已被设置(它是一个字符串)。

当我在viewDidLoad中访问它时,它会返回正确的值...我还没读过的任何内容,或者我做错了什么?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您无法在-init函数中访问self.key,因为此时尚未设置它。你之后设置它:

PushOnStackViewController *vc = [[PushOnStackViewController alloc] init]; // init runs here.
vc.key = [self.keys objectAtIndex:[indexPath row]]; // but you don't set the key property until here.

您可以尝试在init函数中添加“key”参数,如下所示:

-(id)initWithKey:(NSString*)key {
   self = [super init];
   if (self) {
      self.key = key;
      ...etc...
   }
   return self;
}

答案 1 :(得分:0)

在设置属性之前调用init方法。摆脱该init方法并将代码移动到viewDidLoad以确保在完成所有属性设置后调用它。

除非您知道自己在做什么,否则不要为UIViewController创建新的init方法。创建属性(就像你已经完成的)并在viewDidLoad方法中访问该属性要容易得多。