Я мог бы использовать некоторую помощь в отладке ошибки EXC_BAD_ACCESS
, принятой в команде [context deleteObject:loan];
. Ошибка получена в следующем делетете:Плохой доступ к данным ядра deleteObject
- (void)didCancelNewLoan:(Loan *)loan {
// save the context
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
[context deleteObject:loan]; // *** EXC_BAD_ACCESS here ***
// This method is called from a the following method in a second class:
- (IBAction)cancel:(id)sender {
[delegate didCancelNewLoan:self.loan];
}
// The loan ivar is created by the original class
// in the below prepare for Segue method:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"NewLoan"]) {
UINavigationController *navController = (UINavigationController *)[segue destinationViewController];
LoanViewController *loanView = (LoanViewController *)[[navController viewControllers] lastObject];
loanView.managedObjectContext = self.managedObjectContext;
loanView.delegate = self;
loanView.loan = [self createNewLoan];
loanView.newLoan = YES;
}
// Finally, the loan is created in the above
// method's [self createNewLoan] command:
- (NSManagedObject *)createNewLoan {
//create a new instance of the entity managed by the fetched results controller
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newManagedObject setValue:[NSDate date] forKey:@"timeStamp"];
CFUUIDRef uuid = CFUUIDCreate(NULL);
CFStringRef uuidstring = CFUUIDCreateString(NULL, uuid);
//NSString *identifierValue = (__bridge_transfer NSString *)uuidstring;
[newManagedObject setValue:(__bridge_transfer NSString *)uuidstring forKey:@"identifier"];
CFRelease(uuid);
CFRelease(uuidstring);
NSError *error;
[self.fetchedResultsController performFetch:&error];
NSLog(@"%i items in database", [[self.fetchedResultsController fetchedObjects] count]);
return newManagedObject;
}
Оцените свой взгляд на вышеуказанные методы.
Благодарим за отзыв. Я попробовал несколько ваших предложений. При запуске кода выше в контроллере представления, который получил действие, я получаю ту же ошибку. Я включил зомби и получил больше информации об ошибках: «[Сохранение CFString]: сообщение отправлено на освобожденный экземпляр ...» И, да, ваши данные верны, данные отображаются в представлении таблицы, и я реализовал методы делегирования NSFetchedResultsController при приеме просмотрите контроллер. – Jack
Можете ли вы попробовать '__bridge' ваш CFString, а не' __bridge__transfer'? Похоже, что ваш объект CFString будет выпущен слишком рано. – Rog
Или оставьте это как есть и НЕ отпустите 'uuidstring', поскольку ARC делает это для вас в соответствии с моим пониманием документации. – Rog