Изначально мое приложение аварийно завершало работу с BAD_EXEC_ACCESS. Я включил NSZombieEnabled, этот вывод ниже. Авария чрезвычайно противоречива. Если происходит сбой, он всегда происходит в одном из трех мест, но не всегда происходит сбой при прохождении этих строк кода. То есть иногда он падает в одном из этих мест в первых 10 взаимодействиях с пользователем, и иногда я могу удерживать элементы управления (когда он проходит через эти строки кода) более минуты, прежде чем он окончательно падает.
Вывод NSZombieEnabled также является непоследовательным, как отмечено в «Сбой места № 2» - два выхода NSZombieEnabled являются примерами сбоя приложения в одной строке кода, но с разными выводами NSZombieEnabled.
Я знаю, что, как правило, этот тип ошибки означает, что я переиздала что-то, но я не могу понять более конкретно, чем то, что я делаю неправильно.
Правила управления памятью, которым я следую:
- Для каждого init / alloc у меня есть соответствующий релиз
(Ни в одной точке моего кода это не было бы так сложно, как создание объекта в методе и последующее его освобождение в том же методе).
- Для каждого сохраняемого свойства у меня есть соответствующая версия в dealloc ()
(Я слышал о «установке IBOutlets на ноль» в связи с управлением памятью, но я не нашел адекватного описания того, как это делается, поэтому в моем приложении этого не происходит.)
Пожалуйста, дайте мне знать, если бы я мог предоставить какую-либо дополнительную информацию, которая была бы полезной.
Заранее спасибо! Извините, если я слишком длинный и тщательный (INTP)!
-Roben
Ниже приведена запись некоторых выходных данных о сбоях. Когда происходит сбой, он всегда находится в одном из этих трех мест. Места были определены путем выполнения обратной трассировки после сбоя и поиска номеров строк и файлов кода, которые я написал.
Место аварии # 1:
if (![[self fetchedResultsController] performFetch:&error])
Пример местоположения сбоя # 1 NSZombieEnabled Вывод:
*** -[Not A Type release]: message sent to deallocated instance 0x3b3f570
Место аварии № 2:
NSMutableArray *tips = [NSMutableArray arrayWithArray: [[[categories objectAtIndex: indexPath.row] valueForKey:@"tips"] allObjects]];
Пример местоположения сбоя # 2 NSZombieEnabled Вывод:
*** -[CFArray retain]: message sent to deallocated instance 0x3e53990
*** -[NSFetchRequest retain]: message sent to deallocated instance 0x3b2f2c0
Место аварии № 3:
NSMutableArray *tips = [NSMutableArray arrayWithArray: [[[justOneCategory objectAtIndex: 0] valueForKey:@"tips"] allObjects]];
Пример Crash Location # 3 NSZombieEnabled Вывод:
*** -[UIViewControllerWrapperView retain]: message sent to deallocated instance 0x3e593a0
Пример Backtrace (соответствует строке № 3):
#0 0x01d6a3a7 in ___forwarding___ ()
#1 0x01d466c2 in __forwarding_prep_0___ ()
#2 0x01cfd988 in CFRetain ()
#3 0x01cfd495 in CFArrayCreate ()
#4 0x01d406c3 in -[__NSPlaceholderArray initWithObjects:count:] ()
#5 0x01d5d34a in +[NSArray arrayWithObjects:count:] ()
#6 0x01d6386e in -[NSSet allObjects] ()
#7 0x00003bbc in -[RootViewController getRandomTip:] (self=0x3b24ea0, _cmd=0x7447, sender=0x3b38330) at /Users/***/Classes/RootViewController.m:36
#8 0x00299405 in -[UIApplication sendAction:to:from:forEvent:] ()
#9 0x002fcb4e in -[UIControl sendAction:to:forEvent:] ()
#10 0x002fed6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#11 0x002fdabb in -[UIControl touchesEnded:withEvent:] ()
#12 0x002b2ddf in -[UIWindow _sendTouchesForEvent:] ()
#13 0x0029c7c8 in -[UIApplication sendEvent:] ()
#14 0x002a3061 in _UIApplicationHandleEvent ()
#15 0x0252ed59 in PurpleEventCallback ()
#16 0x01d41b80 in CFRunLoopRunSpecific ()
#17 0x01d40c48 in CFRunLoopRunInMode ()
#18 0x0252d615 in GSEventRunModal ()
#19 0x0252d6da in GSEventRun ()
#20 0x002a3faf in UIApplicationMain ()
#21 0x00002a60 in main (argc=1, argv=0xbfffef9c) at /Users/***/main.m:14
EDIT: добавление некоторого дополнительного кода и вывода, запрошенного Griffo
Спасибо за ответ, еще раз напишите что-нибудь конкретное, что было бы полезно? А пока вот весь метод, который содержит и Crash Location # 1, и Crash Location # 2.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == ALLTIPS_SECTION) {
self.tipsController.title = @"Tips";
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
// NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
// abort();
}
self.tipsController.tips = [NSArray arrayWithArray: [fetchedResultsController fetchedObjects]];
} else {
self.tipsController.title = [[categories objectAtIndex: indexPath.row] name];
NSMutableArray *tips = [NSMutableArray arrayWithArray: [[[categories objectAtIndex: indexPath.row] valueForKey:@"tips"] allObjects]];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending: YES];
[tips sortUsingDescriptors: [NSArray arrayWithObject: sortDescriptor]];
[sortDescriptor release];
self.tipsController.tips = [NSArray arrayWithArray: tips];
}
[self.navigationController pushViewController:self.tipsController animated:YES];
}
Я не запускал malloc_history для конкретного аварийного сбоя, о котором вы спрашивали, но я запустил его на # 3, вот этот вывод, я понятия не имею, как я должен анализировать это, поэтому любой совет будет полезен (во всех учебники по malloc_history, которые я прочитал, показывают вывод, и все они похожи на "там, где это есть", а я на "где? wtf ты смотришь"):
* * 1068