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 изнутри блока? Взаимодействие с пользовательским интерфейсом должно быть в основном потоке?
В моем случае помогло продвижение базы данных в отдельный контекст. Я использовал следующий конструктор для класса, который получал сообщение:
-(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.
пожалуйста, проверьте экземпляр класса, который содержит метод, который вы вызываете, и убедитесь, что он не освобожден.
или добавьте вызывающий метод к вопросу, чтобы мы могли его проверить.