Получение ошибок в ConnectionDidFinishLoading, EXC_BAD_ACCESS - PullRequest
0 голосов
/ 13 ноября 2011

Я получаю ошибки, когда выполняется метод делегата NSURLConnection connectionDidFinishLoading.Интересно, что он работает на симуляторе, но вылетает на физическом устройстве.Что еще интереснее, он падает только после выполнения этой последовательности операций,

  • Запустить приложение
  • Показывает Tweet!(Великолепно)
  • Нажмите кнопку «Домой»
  • Дважды нажмите кнопку «Домой»
  • Принудительно закройте приложение
  • Снова откройте приложение
  • CRASHED !!!!!(:()… Продолжайте сбой до перезагрузки телефона!

ЖУРНАЛ ОШИБКИ :

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0xa0000008
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libobjc.A.dylib                 0x321befbc 0x321bb000 + 16316
1   Tittle-Tattle                   0x0002cf10 -[MapViewController connectionDidFinishLoading:] (MapViewController.m:108)
2   Foundation                      0x3316bc32 0x330a5000 + 814130
3   Foundation                      0x330c36e2 0x330a5000 + 124642
4   Foundation                      0x330c36ac 0x330a5000 + 124588
5   Foundation                      0x330c35ce 0x330a5000 + 124366
6   CFNetwork                       0x35e7689e 0x35e67000 + 63646
7   CFNetwork                       0x35e6b53e 0x35e67000 + 17726
8   CFNetwork                       0x35e6b632 0x35e67000 + 17970
9   CFNetwork                       0x35e6b23c 0x35e67000 + 16956
10  CFNetwork                       0x35e6b172 0x35e67000 + 16754
11  CoreFoundation                  0x34176afc 0x340e9000 + 580348
12  CoreFoundation                  0x341762c8 0x340e9000 + 578248
13  CoreFoundation                  0x3417506e 0x340e9000 + 573550
14  CoreFoundation                  0x340f84d6 0x340e9000 + 62678
15  CoreFoundation                  0x340f839e 0x340e9000 + 62366
16  GraphicsServices                0x3254dfc6 0x3254a000 + 16326
17  UIKit                           0x3734e73c 0x3731d000 + 202556
18  Tittle-Tattle                   0x000200e0 main (main.m:16)
19  Tittle-Tattle                   0x00020084 start + 32

КОД :

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    [urlConnection cancel];
    [urlConnection release];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    //Since we got new fresh data we shall put it in LatestLocationData entity in CoreData
    [self insertLastKnownLocationDataIntoCoreDataWith:responseString];

    //Test purpose only, See what we have got in CoreData
    [self fetchLastKnownLocationDataFromCoreData];

    NSDictionary *results = [responseString JSONValue];
    placesNearBy = [results objectForKey:@"results"];

    [responseString release];

    [self dropNearByPlacesAnnotationsFrom:placesNearBy];

}

Вопрос: Что может быть причиной этого?

Подобный вопрос (не мной!) Ранее задавался, но никто не ответил на этот вопрос: Приложение не работает в iOS 5

Насколько я понимаю, EXE_BAD_ACCESS происходит только тогда, когда вы пытаетесь получить доступ к адресу памяти, который не был выделен или ранее выделен, но теперь он освобожден.

РЕДАКТИРОВАТЬ ПОСЛЕ ОТВЕТА В КОММЕНТАРИИ:

Привет Firoze, вот как я являюсь инициатором NSURLConnection

urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

1 Ответ

3 голосов
/ 13 ноября 2011

Глядя на ваши комментарии, я бы предложил вам использовать @property объявления для всех ваших ivars.Они облегчат вам все ручное управление памятью, которое, вероятно, лежит в вашей проблеме.

Быстрый пример

YourClass.h

@interface YourClass
@property (nonatomic, retain) NSURLConnection *urlConnection;
// More ivars

// Method declations
@end

YourClass.m

@interface YourClass

@synthesize urlConnection = _urlConnection;

// The method where you instantiate urlConnection
{
    NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request
                                                                     delegate:self];
    self.urlConnection = urlConnection;
    [urlConnection release]; urlConnection = nil;

    // Do whatever else you do here
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{
    [self.urlConnection cancel];
    self.urlConnection = nil;     <- This takes care of releasing the ivar and setting it to nil so there is no dangerous hanging pointer

    // ... the rest of your method
}

[urlConnection cancel];
[urlConnection release];
// You need to clean up after yourself with any ivars you make
- (void)dealloc
{
    [_urlConnection release]; 
    // Release any other ivars
    [super dealloc];
}
@end
...