Iphone Основные данные сбой при сохранении

голоса
14

В настоящее время я пишу приложение Iphone с использованием основных данных , и я получаю сообщение об EXC_BAD_ACCESSошибке во время [managedObjectContext сохранение: && ошибка] строке кода. Этот сбой происходит только после того, как я могу изменить некоторые поля. Более конкретно моя компания имеет два строковых поля (из примерно 10 полей), которые получают свои значения от возвращения контроллера представления модально (например , текстовый редактор). Крушение также происходит только после того, как эти поля редактируется, первый раз , когда я поставил значение в нем работает отлично.

Причина у меня есть строка с конструкторами формата только с строками, потому что я пытался копировать построить ... не уверен, если это происходит автоматически? Мысль, возможно, сохранить / релиз сообщение от этих строк (те два из контроллера представления модального), становился освобождено от увольнения модального контроллера представления или что-то. Угадайте, не хотя, потому что она по-прежнему не работает.

Вот участок кода, который разваливается:

[EDITED]

        - (void)actionSheet:(UIActionSheet *)modalView clickedButtonAtIndex:    (NSInteger)buttonIndex
      switch(buttonIndex) {
              case 0: {
                if(message == nil) {
                  message = [NSEntityDescription insertNewObjectForEntityForName:@MailMessage inManagedObjectContext:self.managedObjectContext];
                }
                message.toString = txtTo.text;
                message.fromString = txtFrom.text;
                message.subjectString = txtSubject.text;
                message.backgroundColor = [NSNumber numberWithInt:[bgColor intValue]];
                message.textArray = [NSString stringWithFormat:@%@, stringTextArray];
                message.htmlString = [NSString stringWithFormat:@%@, stringHTML];
                message.timeStamp = [NSDate date];
                message.statusCode = [NSNumber numberWithInt:0];
                NSError *error = nil;
                if (![message.managedObjectContext save:&error]) {
                    abort();
                }   
                break;
               }
              case 1: {
             break;
              }
      }
      if(buttonIndex != modalView.cancelButtonIndex) {
      [webViewBody loadHTMLString:@<html><head></head><body></body></html> baseURL:[NSURL URLWithString:@]];
      [self.navigationController popToRootViewControllerAnimated:YES];
}

}

А вот журнал аварии:

Тип исключения: EXC_BAD_ACCESS (SIGBUS)
Исключительные коды: KERN_PROTECTION_FAILURE в 0x00000015
Разбился Тема: 0

Тема 0 Разбился:
0 libobjc.A.dylib 0x30011940 objc_msgSend + 20
1 CoreData 0x367f7d3e - [NSKnownKeysDictionary1 dealloc] + 82
2 CoreData 0x367f7cda - [NSKnownKeysDictionary1 релиз] + 34
3 CoreData 0x3687eec4 - [NSManagedObject (_NSInternalMethods) _setOriginalSnapshot__:] + 40
4 CoreData 0x36821030 - [NSManagedObjectContext (_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] + 16
5 CoreData 0x368205f2 - [NSManagedObjectContext (_NSInternalAdditions) _didSaveChanges] + 958
6 CoreData 0x368133bc - [NSManagedObjectContext сохранить:] + 412
7 Decome 0x0001fdd6 - [CreateMessageViewController actionSheet: clickedButtonAtIndex:] (CreateMessageViewController.m: 163)
8 UIKit 0x30a6cbd8 - [UIActionSheet (частное) _buttonClicked:] + 256
9 CoreFoundation 0x30256dd4 - [NSObject performSelector: withObject: withObject:] + 20
10 UIKit 0x3096e0d0 - [UIApplication sendAction: до: от: forEvent:] + 128
11 UIKit 0x3096e038 - [UIApplication sendAction: toTarget: fromSender: forEvent:] + 32
12 UIKit 0x3096e000 - [UIControl sendAction: до: forEvent:] + 44
13 UIKit 0x3096dc58 - [UIControl (внутренний) _sendActionsForEvents: withEvent:] + 528
14 UIKit 0x309a6e9c - [UIControl touchesEnded: withEvent:] + 452
15 UIKit 0x309a60d4 - [UIWindow _sendTouchesForEvent:] + 520
16 UIKit 0x309a5464 - [UIWindow SendEvent:] + 108
17 UIKit 0x30936e3c - [UIApplication SendEvent:] + 400

Любая помощь приветствуется, спасибо.

UPDATE: Кроме того, даже несмотря на сбои программ, когда я открываю его обратно вверх него данные сохранены правильно. Так EXC_BAD_ACCESS должно произойти после того, как сохранить получил достаточно, по крайней мере пока хранить в постоянной памяти я думаю.

Если я закомментируйте сохранить линию, код теперь работает отлично. Но это не спасает после того как я закрыть и выйти. Если я запускаю сохранить строку в моем корневом Списке контроллерах willAppear функции, он выдает ту же ошибку EXC_BAD_ACCESS. Консоль имеет ничего, кроме EXC_BAD_ACCESS не сказать, если я трассировку я получаю:

# 0 0x30011940 в objc_msgSend ()
# 1 0x367f7d44 в - [NSKnownKeysDictionary1 dealloc] ()
# 2 0x367f7ce0 в - [NSKnownKeysDictionary1 выпуск] ()
# 3 0x3687eeca в - [NSManagedObject (_NSInternalMethods) _setOriginalSnapshot__:] ()
# 4 0x36821036 в - [NSManagedObjectContext (_NSInternalAdditions) _clearOriginalSnapshotAndInitializeRec:] ()
# 5 0x368205f8 в - [NSManagedObjectContext (_NSInternalAdditions) _didSaveChanges] ()
# 6 0x368133c2 в - [NSManagedObjectContext сохранить:] ()
# 7 0x0000314e в - [RootViewController viewWillAppear:] (само = 0x11b560, _cmd = 0x3014ecac, анимированный = 1 '\ 001') в /Users/inckbmj/Desktop/iphone/Decome/Classes/RootViewController.m:85

К сожалению код не был отформатирован ранее. Когда этот контроллер получает вид создан, если он не является новым «сообщение» он передается объект сообщения, полученный из fetchedResultsController следующим образом:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    MailMessage *aMessage = (MailMessage *)[fetchedResultsController objectAtIndexPath:indexPath];
    [messageView loadMessage:aMessage viewOnly:NO usingTemplate:NO];
    messageView.managedObjectContext = self.managedObjectContext;
    [self.navigationController pushViewController:messageView animated:YES]; 
}

(Первый набор кода из файла MessageViewController.m, который является классом, который messsageView есть)

Он выходит из строя только тогда, когда я представляю свою EditorViewController как вид модальный, а затем вернуться. Даже если я изменить строки TextArray и HTMLString (которые являются единственными вещами, вид модального влияет) на:

message.textArray = @HELLO;
message.htmlString = @HELLO;

она по-прежнему падает. Если я комментирую обе строки из однако это не врезаться.

Так что, похоже, как он выходит из строя, если я представляю модальное представление, а затем попытаться изменить либо TextArray или HTMLString поле моего NSOManagedObject ...

Вот где я представить вид:

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event {
    if(!viewOnly) {
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView: txtTo];
    location = [touch locationInView: webViewBody];
        if(CGRectContainsPoint(webViewBody.bounds, location)) {
            [editor loadTextArrayString:stringTextArray];
            [self presentModalViewController:editor animated:YES];
        }
    }
}

и где я уволить его:

-(void)returnWithTextArray:(NSString *)arrayString HTML:(NSString *)html bgColor:(NSNumber *)numColor {
    [self dismissModalViewControllerAnimated:YES];
    self.stringTextArray = [NSString stringWithFormat:@%@, arrayString];
    self.stringHTML = [NSString stringWithFormat:@%@, html];
    self.bgColor = [NSNumber numberWithInt:[numColor intValue]];
    [webViewBody loadHTMLString:self.stringHTML baseURL:[NSURL URLWithString:@]];
}
Задан 05/08/2009 в 03:16
источник пользователем
На других языках...                            


7 ответов

голоса
22

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

В то время как вы перестали получать сообщение об ошибке при установке setRetainsRegisteredObjects: ДА, вы, возможно, ввели вопрос управления памятью, поскольку вы устанавливаете срок службы управляемого объекта, зависят от срока службы контекста управляемого объекта. Если вы передаете свой контекст вокруг в течение вашего приложения, это может быть довольно большим, если у вас есть большая иерархия объектов.

Вы можете прочитать больше в документации Apple , здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMemory.html .

Ответил 02/12/2010 в 03:24
источник пользователем

голоса
8

Решена проблема, хотя я не уверен, что я обращаюсь к фактической первопричине. Ошибка была устранена, когда я добавил эту строку:

[managedObjectContext setRetainsRegisteredObjects:YES];

Туда, где я создаю managedObjectContext. Таким образом, я предполагаю, что это было связано с сохраняющих подсчетов. Я предполагаю, что возможно получить переменный экземпляр выпустил частично или временно или что-то, когда представлены модальные мнения? Я не знаю. В любом случае, эта ошибка была устранена в настоящее время в порядке на программу работы.

Ответил 10/08/2009 в 06:58
источник пользователем

голоса
4

Просто, чтобы помочь другим, имеющие тот же вопрос, и усиление реакции STEFF в выше, вероятно, причиной этой ошибки является то, что вы пытаетесь выпустить NSManagedObject.

Ответил 11/10/2010 в 12:32
источник пользователем

голоса
0

Я решил аналогичную проблему, убедившись, что объект извлекается, так что для примера выше:

if ( message == nil ) {
    message = [NSEntityDescription insertNewObjectForEntityForName:@"MailMessage" inManagedObjectContext:self.managedObjectContext];
} else {
    NSError *error = nil;
    message = (MailMessage *)[managedObjectContext existingObjectWithID:[message objectID] error:&error];
}
Ответил 19/12/2012 в 17:00
источник пользователем

голоса
0

Вы должны установить кэш FRC к нулю

Ответил 02/09/2010 в 22:55
источник пользователем

голоса
0

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

Ответил 10/08/2010 в 14:26
источник пользователем

голоса
0

Я видел много забавных поведения с CoreData на iPhone, которые были решены путем сброса содержимого и настроек в симуляторе iPhone.

Ответил 05/08/2009 в 15:43
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more