财产被取消

时间:2016-01-03 14:11:57

标签: ios objective-c iphone core-data properties

我有一个现有的应用程序,自2010年开始在应用程序商店中存放。由于缺少空闲时间,我无法将其从iOS7之前的版本更新到iOS7 +到现在为止。这就是我目前要做的事情(使用最新的9.2 SDK)。

然而,我遇到了一些奇怪的问题,我甚至无法接近一些可能的原因,而且我很遗憾,不知道如何进一步调查。

启动时,应用程序从核心数据存储加载一个对象,该对象属于类YearSummary(直接继承NSManagedObject,并且只有一些简单的属性)。该对象保存在我的根视图控制器的retain - 属性中 现在奇怪的是,在成功加载对象之后,属性以某种方式重置为nil,并且根视图控制器无法在我的应用程序中显示对象属性。我不知道这是怎么发生的,以及为什么会这样。

我已经使用自己的setter将其设置为非属性,因此我可以跟踪它何时重置为nil,但没有成功。没有找到对象的明显变化。

这大致是我的代码:(应用代码相当大,我试图找到重要的部分)

rootviewcontroller.m

-(void)viewDidLoad
{
    YearSummary* thisYear= [SomeClass fetchYear:2016];
    self.currentYear= thisYear;   // retain property

    NSLog(@"Loaded existing Summary (%p) for CURRENT year (%d)", thisYear, 2016);

    [self.tableView reloadData];  // will display stuff from current year in a tableview
    [super viewDidLoad];
}

someclass.m

+(YearSummary*)fetchYear:(int)year
{
   NSManagedObjectContext* context= [ServiceClass getManagedObjectContext];

   if (!context)
      return false;

   NSFetchRequest* request = [[NSFetchRequest alloc] init];
   NSEntityDescription* entity = [NSEntityDescription entityForName:@"YearSummary" inManagedObjectContext:context];
   NSPredicate* predicate = [NSPredicate predicateWithFormat:@"year == %d, year];
   NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" ascending:NO];
   NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

   [request setPredicate:predicate];
   [request setEntity:entity];
   [request setSortDescriptors:sortDescriptors];
   [sortDescriptors release];
   [sortDescriptor release];

   NSError* error= nil;
   NSArray* results = [context executeFetchRequest:request error:&error];

   [request release];

   if (!results || ![results count])
   {
      [ServiceClass showErrorMessage:NSLocalizedString(@"Error", nil) withText:NSLocalizedString(@"Failed to load data from storage", nil) andError:error];
      return 0;
   }

   return [results objectAtIndex:0];
}

再次rootviewcontroller.m

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{
   NSLog(@"Tableview header with year year (%d) (%p)", self.currentYear.year.intValue, self.currentYear);

   if (self.currentYear)
      return [NSString stringWithFormat:@"%@ %d", NSLocalizedString(@"Overview", nil), [[self.currentYear year] intValue]];

   NSLog(@"DONT HAVE CURRENT YEAR");

   return @"";
}

这将在应用开始时打印:

2016-01-03 14:51:39.410 MyApp[12103:655470] Loaded existing Summary (0x13f6e0f90) for CURRENT year (2016)
2016-01-03 14:51:40.394 MyApp[12103:655470] Tableview header with year year (2016) (0x13f6e0f90)

但是表头显示了一个nil-string作为标题,这让我感到困惑,因为根据上面的代码应该可能吗?

当我拖动tableview时,重新创建标题,打印出来:

2016-01-03 14:51:42.695 MyApp[12103:655470] Tableview header with year year (0) (0x0)
2016-01-03 14:54:13.089 MyApp[12103:655470] DONT HAVE CURRENT YEAR

有人可以引导我找到一个可能的解决方案,或者给我一些提示,告诉我如何追查这种行为的根本原因?

注意:由于这是一个旧的应用程序,我在我的项目中没有使用ARC。

[编辑] 我还添加了一个观察点,如下所示。这是输出:

Watchpoint created: Watchpoint 2: addr = 0x125740fa8 size = 8 state = enabled type = w
    watchpoint spec = 'currentYear'
    new value: 0x0000000000000000

......大约一秒钟之后:

Watchpoint 1 hit:
old value: 0x0000000000000000
new value: 0x000000013ccdcf90

1 个答案:

答案 0 :(得分:1)

来自评论:

当对象的属性具有意外值时,尤其是看似未初始化的属性时,请通过记录地址或在调试器中查看该对象来检查该对象实际上是您期望的对象。

(这在视图控制器中的nil IBOutlets中尤为常见。)