我正在为 iphone(iOS 7,Xcode5)编写一个应用程序,并从其中一个 viewController 类(TrackDetailsViewController)中发现了一些奇怪的行为:
当这个视图被调用时,我通过 prepareForSegue 方法传递了一个带有一些信息的 Track 项目。现在,当我在 viewDidLoad 方法中检查 Track Item 时,它存在并且拥有我期望它拥有的所有数据。但是,当我在 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。
在那之后,整个事情对我来说变得更加奇怪,因为当我将变量 track2 添加到 .m 文件时,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 类的其他方法中使用它。
以前有没有人遇到过这样的问题,对此行为的一些解释?还是找到比创建虚拟变量更优雅的解决方法?
干杯!