我有一个自定义类BoardMatchData,其中包含有关国际象棋比赛的信息。

我还获得了一个名为BoardViewController的自定义UIViewController,当用户从列表中选择一个匹配项时会对其进行分配。

这是我创建BoardViewController,设置其委托然后设置新的BoardMatchData的代码片段:

    Games *selectedGame = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    if (!self.bvc) {
        NSLog(@"Alloc-ing a BVC");
        self.bvc = [[BoardViewController alloc] init];
        self.bvc.delegate = self;
    }
    [self.bvc setNewBoardMatchData:[MasterViewController boardMatchDataFromGame:selectedGame]];

调试时,我可以看到此方法setNewBoardMatchData被调用,并且其中包含有效数据。但是,稍后在BoardViewController中,此boardMatchData似乎总是为零。这是setNewBoardMatchData方法:
- (void)setNewBoardMatchData:(BoardMatchData *)newBoardMatchData {
    NSLog(@"BMD is being set");
    if (self.boardMatchData != newBoardMatchData) {
        self.boardMatchData = newBoardMatchData;
        [self configureView];
    }
    if (self.masterPopoverController != nil) {
        [self.masterPopoverController dismissPopoverAnimated:YES];
    }

}

在BoardViewController.h中,我只有一个实例变量:
BoardMatchData *boardMatchData;

方法声明:
- (void)setNewBoardMatchData:(BoardMatchData *)newBoardMatchData;

然后在BoardMatchData.m的顶部,我有:
@interface BoardViewController ()
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
@property (nonatomic,retain) BoardMatchData *boardMatchData;
- (void)configureView;
@end

@synthesize boardMatchData = _boardMatchData;

...我的目的是确保设置器仅被自身调用,而不由其他任何对象调用。

我尝试设置self.boardMatchData是否有问题?

我没有使用任何保留/发布功能,因为我使用的是ARC。

编辑:

Caleb-在尝试查找此错误的过程中,我做了@synthesize语句。最初我有:

@synthesize boardMatchData;

...我刚切换回去。行为是相同的。 self.boardMatchData总是以nil结尾,即使我设置了它也是如此。

我想现在我只有一个ivar,boardMatchData,并且我总是通过self.boardMatchData访问它。

如何防止这种情况变为零?

最佳答案

@synthesize boardMatchData = _boardMatchData;

这表示访问器应该使用的ivar是_boardMatchData,但是您还拥有一个名为boardMatchData的ivar。如果您使用访问器,则仅设置_boardMatchData。由于在创建对象时,Objective-C会自动清除所有ivars,因此boardMatchData ivar将始终为nil。

07-26 09:38