У меня есть существующее приложение, которое находится в магазине приложений с 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
Вы пробовали положить * * на точку наблюдения переменного экземпляра поддержки? Также может быть достигнуто обновление ARC и стоит усилий. – trojanfoe
Как это сделать? – user826955
Я добавил точку наблюдения, см. Результаты выше в отредактированном сообщении. – user826955