ios - 属性(property)被取消

标签 ios objective-c iphone core-data properties

我有一个现有的应用程序,自 2010 年以来一直在应用程序商店中。由于缺乏空闲时间,我无法将它从 iOS7 之前的版本更新到 iOS7+。这就是我目前正在尝试做的事情(使用最新的 9.2 SDK)。

但是,我遇到了一些奇怪的问题,我什至无法接近某些可能的原因,而且我很迷茫,不知道如何进一步调查。

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

我已经用自己的 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)

但是表头显示一个零字符串作为标题,这让我很困惑,因为根据上面的代码应该不可能是可能的吗?

当我拖动表格 View ,重新创建标题时,将打印以下内容:

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

最佳答案

来自评论:

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

(这对于 View Controller 中的 nil IBOutlets 尤其常见。)

关于ios - 属性(property)被取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577434/

相关文章:

ios - iOS 硬件上的(立方体贴图)纹理采样器数量

ios - 警报正文中的 URL

iOS 不同页面导航栏颜色不同

ios - 是否可以使用 CoreBluetooth 找到 3.0 蓝牙设备?

iphone - 嵌套表格 View 的视差

iphone - 如何使用 CATransform3DMakeRotation 从左到右旋转 View

ios - 非零整数值的核心数据 EXC_BAD_ACCESS

ios - 从 UITableView 单元格内的 url 加载异步图像 - 滚动时错误的图像加载

iPhone - 使用 Reachability 抛出重复符号 _OBJC_IVAR 错误

iphone - 你能改变 UIScrollView 滚动的灵敏度吗?