2016-01-03 6 views
0

У меня есть существующее приложение, которое находится в магазине приложений с 2010 года. Из-за нехватки свободного времени я не смог обновить его с предварительного iOS7 до iOS7 + до сих пор. И это то, что я пытаюсь сделать в данный момент (с последним 9.2 SDK).Недвижимость получает нулевое значение

Однако у меня возникла какая-то странная проблема, и я не могу даже приблизиться к какой-либо возможной причине, и я довольно потерян и не знаю, как исследовать дальше.

При запуске приложение загружает объект из основного хранилища данных, который имеет класс YearSummary (непосредственно наследует NSManagedObject и имеет только некоторые простые атрибуты). Этот объект сохраняется в файле retain моего корневого диспетчера представлений.
Теперь странно, что после того, как объект был успешно загружен, свойство каким-то образом сбрасывается до 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) 

Но заголовок таблицы показывает ноль-строку в качестве заголовка, который меня смущает, потому что в соответствии с вышеуказанным кодом должны не возможно ??

Когда я перетащить 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 в своем проекте.

[edit] Я также добавил точку наблюдения, как предложено ниже. Это выход:

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 
+0

Вы пробовали положить * * на точку наблюдения переменного экземпляра поддержки? Также может быть достигнуто обновление ARC и стоит усилий. – trojanfoe

+0

Как это сделать? – user826955

+0

Я добавил точку наблюдения, см. Результаты выше в отредактированном сообщении. – user826955

ответ

1

Из комментариев:

Когда свойство объекта имеет неожиданное значение, особенно тот, который, как представляется, неинициализируйте, убедитесь, что объект на самом деле тот, который вы ожидаете от него, путем регистрации адреса или просмотра его в отладчике.

(Это особенно распространено с нулевым IBOutlets в контроллере представления.)

Смежные вопросы