NSObjectInaccessibleException после открытия контроллера uiview - PullRequest
0 голосов
/ 25 июля 2011

Я занимаюсь разработкой приложения, в котором с настраиваемой панелью вкладок открывается другое представление таблицы.Информация к представлению таблицы подается с помощью удаленного канала JSON.И сохраняются в Core Data с помощью пользовательского объекта nsmanagedobject.

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

В журнале говорится, что NSManagedObject является недействительным.Но как, когда я не удаляю или обновляю объект.Это происходит с каждым рядом клеток.

Что я делаю не так?

Журнал:

* Завершение работы приложения из-за необработанного исключения 'NSObjectInaccessibleException', причина: 'NSManagedObject withID: 0x75401c0 признан недействительным. '
*
Стек вызовов при первом броске:
(
0 CoreFoundation 0x013d15a9 exceptionPreprocess + 185
1 libobjc.A.dylib 0x01525313 objc_exception_throw + 44
2 CoreData 0x0117f120 -NSFaultHandler _fireFirstAndSecondLevelFaultsForObject: withContext:] + 0
3 CoreData 0x01110933 _PF_FulfillDeferredFault + 499
4 CoreData 0x011149af _sharedIMPL_pvfk_core + 95
5 CoreData 0x011247c0 _pvfk_9 + 32
6 Ultima 0x00014bf7 - [ProgramTable Tableview: cellForRowAtIndexPath:] +4247
7 UIKit 0x004c1b98 - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow: withIndexPath:] + 634 * 1 025 * 8 UIKit 0x004b74cc - [UITableView (UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 * +1026 * 9 UIKit 0x004cc8cc - [UITableView (_UITableViewPrivate) _updateVisibleCellsNow:] + 1561
10 UIKit 0x004c490c - [UITableView layoutSubviews] + 242
11 QuartzCore 0x0014fa5a - [CALayer layoutSublayers] + 181
12 QuartzCore 0x00151ddc CALayerLayoutIfNeeded + 220
13 QuartzCore 0x000f70b4 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 * тысяче тридцать-один * 14 QuartzCore 0x000f8294 _ZN2CA11Transaction6commitEv + 292
15 QuartzCore 0x000f846d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 * один тысяча тридцать-три * 16 CoreFoundation 0x013b289b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 27
17 CoreFoundation 0x013476e7 __CFRunLoopDoObservers +295
18 CoreFoundation 0x013101d7 __CFRunLoopRun + 1575
19 CoreFoundation 0x0130f840 CFRunLoopRunSpecific + 208
20 CoreFoundation 0x0130f761 CFRunLoopRunInMode + 97
236e устройства 130x1SexServerUIKit 0x0045ac93 UIApplicationMain + 1160
24 Ultima 0x000028e9 main + 121
25 Ultima 0x00002865 start + 53)
завершить, вызвав выбрасывание исключения [Переключение на процесс 429 thread 0xec03]
sharedlibrary apply-load-rules all
Текущий язык: авто;в настоящее время цель-c

Мой cellForRowAtIndexPath выглядит так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

ProgramCelle *cell = (ProgramCelle*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[ProgramCelle alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
int row = indexPath.row;
int section = indexPath.section;

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"HH:mm"];

if(section == 0){
    Program *p =[eight objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;

}
if(section == 1){
    Program *p =[nine objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 2){
    Program *p =[ten objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 3){
    Program *p =[eleven objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 4){
    Program *p =[twelve objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 5){
    Program *p =[thirteen objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 6){
    Program *p =[fourteen objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 7){
    Program *p =[fifthteen objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 8){

    Program *p =[sixteen objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
if(section == 9){
    Program *p =[seventeen objectAtIndex:row];
    cell.primaryTitle.text = p.title;
    cell.primaryTitle.textColor = [UIColor blueColor];
    Scene *s = p.scene;
    cell.secondaryTitle.text = s.name;
    NSDate *dato = p.tidspunkt;

    NSString *time = [formatter stringFromDate:dato];
    cell.klokke.text = time;
}
[formatter release];
return cell;
}

Где восемь, девять, десять ... - это NSArrays, которые инициируются в viewdidLoad и освобождаются в dealloc.

Ответы [ 3 ]

1 голос
/ 25 июля 2011

Вы, вероятно, не удерживаете объекты достаточно долго (так называемый авто-релиз). Поэтому, когда проходит некоторое время, вы пытаетесь получить доступ к чему-то, чего там больше нет. Попробуйте передать ваши данные в NSMutableArray и использовать их в качестве источника данных в вашем "tableView: cellForRowAtIndexPath".

0 голосов
/ 26 июля 2011

Я узнал это сам. Когда я закрываю оверлейный viewcontroller, я должен перезагрузить данные таблицы. Это не было проблемой какого-либо массива или удаления какого-либо объекта. Нравится

[myTable reloadData];

0 голосов
/ 25 июля 2011

NSObjectInaccessibleException в Базовых данных означает, что у вас есть ссылка на объект, которого нет в постоянном хранилище.

Обычно это означает, что вы удалили его из контекста, сохранив ссылку на него в другом месте, например, в свойстве объекта или в массиве.

Однако вы также можете получить сообщение об ошибке, если сначала не добавите объект в магазин должным образом.Это происходит, когда вы создаете экземпляр NSManagedObject без правильной вставки его в допустимый контекст.

В любом случае, ваша непосредственная проблема заключается в коде, в котором вы создаете и / или сохраняете эти управляемые объекты, а не в коде контроллера табличного представления.Это просто, где происходит ошибка, потому что именно там вы пытаетесь получить доступ к недопустимым управляемым объектам.

...