NSError release: сообщение отправлено на освобожденный экземпляр

Я получаю сбой в приложении iOS 7 со следующей ошибкой:

-[NSError release]: message sent to deallocated instance 0x3c443fe0

Ошибка инициируется, когда я добавляю вызов следующему методу:

-(void)loadMessages:(NSString*)customerUID {
  NSString *formatUID = [NSString stringWithFormat:@"%s%@%s", "'", customerUID, "'"];
  formatUID = [formatUID stringByReplacingOccurrencesOfString:@"'" withString:@"%27"];
  NSString *servicePath = [NSString stringWithFormat:@"/api/messagerecipient?messageid=null&customeruid=%@", formatUID];

  [[RKObjectManager sharedManager] getObjectsAtPath:servicePath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *messagesResult)
  {
    NSArray *messageResults = messagesResult.array;

    if (messageResults != nil || [messageResults count] != 0)
    {
      //Add some code here
    }
  } failure:^(RKObjectRequestOperation *operation, NSError *error) {

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
  }];
}

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

Я также запустил сканирование зомби в инструментах. Это показывает следующее.

инструменты

Я запутался, потому что это показывает, что зомби создается GSEventRunModal вызов. Когда я захожу в Extended Detail и выбираю вызов, он показывает следующее:

Расширенная деталь

Любые указатели будут с благодарностью оценены, спасибо.

Обновление: трассировка стека расширенных деталей прибора

5 ответов

Я также видел это много, и корень проблемы, кажется, в Core Data. Я использую библиотеку базы данных MagicalRecord (как и RestKit), и мы подумали, что ошибка была там. Вы можете увидеть обсуждение здесь. После всего нашего расследования казалось, что MagicalRecord был прав, а Core Data была виновата.

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

Может быть, вы пытаетесь отобразить AlertView изнутри блока? Взаимодействие с пользовательским интерфейсом должно быть в основном потоке?

Как отобразить UIAlertView из блока на iOS?

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

    -(id)init {
    self = [super init];
    if (self) {
        self.managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        self.managedObjectContext.parentContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
        self.managedObjectContext.retainsRegisteredObjects = YES;
    }

    return self;
}

Можете ли вы попробовать заменить:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];

С:

NSString * message = [error localizedDescription];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];

Хотя я предполагаю, что метод init все равно получает строку.

Я думаю, что ваша проблема не в методе, который он сам.

в сообщении об ошибке говорится, что вы отправляете вызов освобождения для объекта типа NSERROR.

пожалуйста, проверьте экземпляр класса, который содержит метод, который вы вызываете, и убедитесь, что он не освобожден.

или добавьте вызывающий метод к вопросу, чтобы мы могли его проверить.

Другие вопросы по тегам