Нечетная ошибка Core Data, вызванная чрезмерным выпуском? - PullRequest
6 голосов
/ 12 сентября 2010

Случайный читатель и задающий вопрос в первый раз, поэтому, пожалуйста, будьте осторожны:)

Я создаю Управляемый объект (Учетная запись), который передается в дочерний контроллер представления, где егозадается в свойстве, которое сохраняется.

Account * account = [[Account alloc] initWithEntity:entity insertIntoManagedObjectContext:context];
AddAccountViewController *childController = [[AddAccountViewController alloc] init];
childController.title = @"Account Details"; 
childController.anAccount = account;
childController.delegate = self;

[self.navigationController pushViewController:childController animated:YES];
[childController release];
[account release];

Интерфейс контроллера представления:

@interface AddAccountViewController : UIViewController {
}

@property (nonatomic, retain) IBOutlet UITextField * usernameTextField;
@property (nonatomic, retain) IBOutlet UITextField * passwordTextField;

@property (nonatomic, retain) Account * anAccount;
@property (nonatomic, assign) id <AddAccountDelegate> delegate;

- (IBAction)cancel:(id)sender;
- (IBAction)add:(id)sender;
- (IBAction)textFieldDone:(id)sender;
@end

Итак, в примере кода 1 я освободил объект account, потому что меня больше не интересуетв этом в этом методе.Поскольку он сохраняется в AddAccountViewController , у меня есть запись в AddAccountViewController ' dealloc , которая его освобождает.

Однако, когда я иду, чтобы удалитьобъект из ManagedObjectContext приложение вылетает со следующей (довольно неясной) ошибкой:

Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
_Unwind_Resume called from function _PFFaultHandlerLookupRow in image CoreData.

После долгих отладок и удаления волос я обнаружил, что если я не освобождаю учетную запись в AddAccountViewController dealloc метод, приложение работает постоянно и не течет в соответствии с инструментами.

Может кто-нибудь пролить свет на то, что происходит?Из документов о свойствах я понимаю, что те, которые были сохранены, должны быть освобождены.Что я пропустил?

Обновление для ответа на вопрос Кевина

Код для удаления объекта из ManagedObjectContext - этов RootViewController (который содержит дочерний контроллер)

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the managed object for the given index path
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        // Save the context.
        NSError *error = nil;
        if (![context save:&error]) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }  
}

Ответы [ 3 ]

1 голос
/ 28 октября 2010

У меня была похожая проблема, заканчивающаяся сообщением «Обнаружена попытка вызвать символ в системных библиотеках, которого нет на iPhone: _Unwind_Resume вызывается из функции _PFFaultHandlerLookupRow в образе CoreData».сообщение об ошибке.

Моей проблемой было неправильное «каскадное» правило удаления для отношения в модели.С этим правилом мой главный управляемый объект был удален, но все еще упоминается в коде.После установки «правила удаления» для этого отношения в «nulify» все работало как задумано.

-> нет проблем с основными данными ... проблема дизайна!

Джонни

1 голос
/ 12 сентября 2010

Во-первых: это звучит как ошибка со стороны Apple. Базовые данные вызывают _Unwind_Resume, что (вероятно) является своего рода исключением. В телефоне существует функция раскрутки исключений, но (я думаю) использует ARM ABI, который использует имена функций, начинающиеся с __cxa_. Ты бегаешь на симуляторе? Какая версия SDK?

Может быть, где-то всплывает дополнительный релиз, который «сбалансирован» при удалении вызова на [account release];.

«Инструменты не показывают утечек» не означает, что их нет; в последний раз я проверял, что он запутался в циклах (то есть, он не показал бы утечки, если бы вы забыли сбросить IBOutlets в dealloc). Я тестировал NSMutableData * d = [NSMutableData dataWithLength:1<<20]; memcpy(d.mutableBytes, &d, 4);, но более простой тест - [[UIView alloc] initWithFrame:CGRectZero].

Если вы считаете, что это проблема сохранения / выпуска, я однажды отладил их, переопределив retain / release / autorelease для вызова NSLog. Затем я добавил точки останова на всех них, настроил их на выполнение команды "bt" и нажал кнопку автоматического продолжения. Затем запустите то, что сломалось (в моем случае я думаю, что это было просто дополнительное сохранение), распечатайте вывод журнала, прикрепите его к доске и потратьте полчаса на сопоставление сохранений и выпусков.

0 голосов
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...