调用viewDidLoad后,viewcontroller的属性消失

时间:2013-09-28 14:41:14

标签: ios objective-c uiviewcontroller

我正在为iphone(iOS 7,Xcode5)编写一个应用程序,并从一个viewController类(TrackDetailsViewController)中发现了一些奇怪的行为:

当调用此视图时,我通过prepareForSegue方法传递一个包含一些信息的Track项。现在,当我在viewDidLoad方法中检查Track项时,它存在并具有我期望它拥有的所有数据。但是,当我在viewDidAppear中再次检查它时,Track Item变为零(参见下面的代码):

TrackDetailsViewController.h:

@interface TrackDetailsViewController : UIViewController <UIScrollViewDelegate>

@property (weak, nonatomic) Track *track;

@end

TrackDetailsViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //check for track
    if (_track !=nil) {
        NSLog(@"track not nil");
    }
    else{
        NSLog(@"no track");
    }

// Do any additional setup after loading the view.
}

-(void) viewDidAppear: (BOOL) animated{

    //check for track
    if (track != nil) {
        NSLog(@"track not nil");
    }
    else{
        NSLog(@"no track");
    }
}

现在运行此代码后的日志(显示有问题的视图后)如下所示:

2013-09-28 16:25:31.877 I-Sail[1388:c07] track not nil
2013-09-28 16:25:32.235 I-Sail[1388:c07] no track

因此,在viewDidLoad和viewDidAppear之间的某处,track属性的值被更改为null。

之后,整个事情变得更加怪异,因为当我向.m文件添加变量track2时track属性保持其值,并将track属性的值赋给track2变量,如代码中所示下面:

Track *track2;

- (void)viewDidLoad
{
    [super viewDidLoad];


    //check for track
    if (_track !=nil) {
        NSLog(@"track not nil");
    }
    else{
        NSLog(@"no track");
    }

    //assign the value of _track to the track2 variable
    track2 = _track;

}

-(void) viewDidAppear: (BOOL) animated{

    //check for track
    if (_track !=nil) {
        NSLog(@"track not nil");
    }
    else{
        NSLog(@"no track");
    }
}

这次输出变为:

2013-09-28 16:35:57.929 I-Sail[1452:c07] track not nil
2013-09-28 16:35:58.286 I-Sail[1452:c07] track not nil

因此属性轨道保持其值,我也可以在viewController类的其他方法中使用它。

之前是否有人遇到过这样的问题,对此行为有何解释?或者找到比创建虚拟变量更优雅的解决方法?

干杯!

1 个答案:

答案 0 :(得分:1)

这是因为您的track属性被指定为weak,这使其成为归零弱引用。据推测,track没有其他强有力的参考。添加track2变量会创建一个强大的引用,这会使它保持不变。您可能不希望此属性为weak