viewcontroller 的一个属性在 viewDidLoad 被调用后消失

Posted

技术标签:

【中文标题】viewcontroller 的一个属性在 viewDidLoad 被调用后消失【英文标题】:A property of viewcontroller disappears after viewDidLoad has been called 【发布时间】:2013-09-28 14:41:13 【问题描述】:

我正在为 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 类的其他方法中使用它。

以前有没有人遇到过这样的问题,对此行为的一些解释?还是找到了比创建虚拟变量更优雅的解决方法?

干杯!

【问题讨论】:

【参考方案1】:

这是因为您的track 属性被指定为weak,这使其成为归零弱引用。大概没有其他对track 的强引用。添加track2 变量会创建对它的强引用,这使得它一直存在。您可能不希望此属性为 weak

【讨论】:

以上是关于viewcontroller 的一个属性在 viewDidLoad 被调用后消失的主要内容,如果未能解决你的问题,请参考以下文章

无法将 tabBarController.viewController 转换为 UINavigationController

如何在新窗口中推送 ViewController

在GameScene和ViewController Swift之间移动

目标c - 更改为viewcontroller的另一个navigationcontroller

我们可以通过检查 isRegisteredForLocalNotifications 从 didRegisterForRemoteNotificationsWithDeviceToken 更新 Vie

Swift UIcollectionView 在同一个 ViewController 上更改第二个 UICollectionView 的内容?