EXC_BAD_ACCESS ошибка
Я сделал приложение, которое должно работать постоянно, пока я его не остановлю. В основном он получает данные от подключенного другого устройства и периодически отправляет эти данные на сервер NSURLConnection
, а также периодически считывает данные с сервера и визуализирует эти данные в виде графика с использованием NSXMLParser
.
Я запустил инструмент, чтобы проверить аллоки и утечки. Никакой утечки. Монитор памяти показывает последовательные 5,2 МБ. Граф Objectalloc стабилен, Net байтов objectallo около 480000, а #net около 6400.
Он разбился примерно через 10-15 часов. Поэтому я добавил точку останова в malloc_error_break
. Теперь я получаю EXC_BAD_ACCESS
ошибку " " на консоли отладчика примерно через 12 часов.
Любая идея?
Одна подозрительная часть - ОТПРАВКА данных.
- (void) sendDataToServerWithX:(float)x Y:(float)y{
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init];
NSString *urlString = [[NSString alloc] initWithFormat:@"http://www.url.com/save_data.php?user=user1&x=%f&y=%f", x, y];
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) { NSLog(@"sending success"); }
//else { }
NSLog( @"data sent.");
[urlString release];
[theConnection release];
[uiUpdatePool drain];
}
Еще одна подозрительная часть - ЧТЕНИЕ данных:
- (void) readCurrentDataFromServer: (NSTimer *) timer {
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
NSURL *url = [[NSURL alloc] initWithString:aString];
NSXMLParser *readXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[readXmlParser setDelegate:parser];
[readXmlParser parse];
(...)
[parser release];
[url release];
[readXmlParser release];
[uiUpdatePool drain];
}
Ответов (3)3
Попробуйте запустить его в симуляторе iPhone с включенным «Guard Malloc» (в меню «Выполнить» Xcode). Это специальный параметр, предназначенный для того, чтобы скрытые ошибки доступа к памяти вызывали немедленные сбои, а не скрывались на время. (Это также сделает ваше приложение очень медленным и потребляет гораздо больше памяти, чем обычно, поэтому оно не всегда включено.) Не уверен, что это поможет, но может.
ОБНОВЛЕНИЕ : приведенные выше инструкции относятся к Xcode 3. В Xcode 4 включите Guard Malloc, щелкнув имя схемы на панели инструментов, выбрав «Редактировать схему», нажав «Выполнить» в исходном списке листа, выбрав вкладку «Диагностика», и установите флажок «Включить Guard Malloc».
Если вы получите, EXC_BAD_ACCESS
то вы, вероятно, также получите журнал сбоев, который поможет вам определить, где произошел сбой. Вероятно, разыменование указателя на память, которая не используется - например, неясно, откуда берутся ваши переменные aString
или url
. Также неясно, имеет ли ваше приложение несколько потоков, и в этом случае ваш локальный компьютер NSAutoreleasePool
может выпускать вещи, которые вы бы предпочли не делать. Все очень сложно сказать.