Невозможно установить переменную-член дважды (NSManagedObject) - PullRequest
0 голосов
/ 31 мая 2011

Я получаю ошибку EXC_BAD_ACCESS при попытке установить значение внутри подкласса NSManagedObject для второй раз .

Я использую зомби, но в консоли ничего не отображается.Распечатка объекта с использованием GDB Я вижу, что объект имеет один и тот же адрес памяти, оба раза я пытаюсь установить значение - хотя не уверен почему.

Ситуация :

  1. У меня есть представление (A), которое при сканировании QR-кода добавляет подпредставление (B), которое, в свою очередь, загружает XML, который затем сохраняется в подклассе NSManagedObject.
  2. Внутри подпредставления (B) я возвращаюсь назад (removeFromSuperView вызывается)
  3. Назад в исходное представление (A)
  4. В следующий разКогда сканируется такой же QR-код, он (A) находит NSManagedObject из базы данных и присоединяет его к переменной экземпляра в новом представлении (того же типа, что и B), которое затем добавляет в качестве подпредставления дляоригинал (A).

В представлении B viewDidLoad я всегда стараюсь установить текущую дату, чтобы отслеживать, когда пользователь «увидел» этот объект. Вот где я получаю сообщение об ошибке EXC_BAD_ACCESS :

    self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];

Где self.currentPiece - это экземпляр подклассного NSManagedObject, который был присоединен в A, когда этот объект существовал в базе данных.

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

Я попытался прояснить это.Пожалуйста, скажите мне, если вы хотите, чтобы я уточнил это еще больше.Спасибо за помощь (работали над этим уже несколько часов)

ОБНОВЛЕНИЕ:

Объявление piece_last_viewed в HubPiece.h:

@interface HubPiece : NSManagedObject {

}

// ...

@property (nonatomic, retain) NSNumber *piece_last_viewed;

HubPiece.m:

@dynamic piece_last_viewed;

//...inside init method:

self.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];

ОБНОВЛЕНИЕ 2:

Исключается не переключение подпредставлений.Затем я понял, что не сохранил свои изменения, поэтому я ввел save: внутри подкласса NSManagedObject.Затем я впервые получил ошибку при первой попытке сохранить экземпляр объекта (который был сохранен во время сеанса приложения, но данные исчезают, если я полностью закрываю приложение и затем снова открываю его).Поэтому я подумал, что использование [context save:&error] было бы хорошей идеей :) ... но теперь это не работает и выдает мне ошибку EXC_BAD_ACCESS.

Сам HubPiece инициализируется из другого класса HubPieceView.m:

self.currentPiece = [[HubPiece alloc] initWithXML:pieceXML];

self.currentPiece - это переменная класса типа HubPiece, которая сначала объявляется в файле .h, а затем синтезируется в файле .m.

Затем внутри HubPiece.m инициализатор выглядиткак это:

-(id)initWithXML:(TBXMLElement *)pieceXML
{
    // Setup the environment for dealing with Core Data and managed objects
    HenryHubAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSEntityDescription *entityHubPiece = [NSEntityDescription entityForName:@"HubPiece" 
                                                      inManagedObjectContext:context];

    // STORING values
    self = [[HubPiece alloc] initWithEntity:entityHubPiece insertIntoManagedObjectContext:context];

    // ...setting variables with normal assignment: self.var = value;

    NSError *error;

    // Save fails
    if (![context save:&error] ){
        NSLog(@" ERROR: %@", [error localizedDescription]);
    }

    return self;
}

1 Ответ

0 голосов
/ 01 июня 2011

Я только что понял свою проблему. Я присваивал значения сущности с помощью обычного присваивания '=':

self.currentPiece.piece_last_viewed = [[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]];

Когда это должно было быть сделано:

[self setCurrentPiece.piece_last_viewed:[[NSNumber alloc] initWithDouble:[[NSDate date] timeIntervalSince1970]] ];

Это потому, что это управляемый объект, который создает собственные средства доступа во время выполнения с помощью инструкции компилятора @dynamic.

...