我有一个自定义类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。