Я работаю над приложением для iPhone, которое получит список покупок в виде xml от службы HTTP REST.Но когда я запускаю приложение, оно выходит с SIGABRT в симуляторе.
По трассировке стека видно, что я нахожусь внутри [выпуск NSAutoreleasePool], поэтому я полагаю, что это проблема управления памятью.Проблема с пулом автоматического выпуска состоит в том, что может быть очень трудно отследить, что является действительной проблемой.
Однако я обнаружил, что это как-то вызвано вызовом [NSURLConnection sendSynchronousRequest], потому чтоЯ помещаю свое заявление возврата непосредственно перед тем вызовом, тогда я не получаю ошибку (кроме данных нет).Если я помещу свой оператор return сразу после sendSynchronousRequest, то получу SIGABRT.
Вот функция
- (NSArray*)getShoppingListItems {
NSString *escapedToken = [self.user.token URLEncodedString_ch];
NSString *strUrl = [[NSString alloc]
initWithFormat:@"http://www.denglademad.dk/shoppinglist/foruser/%@?token=%@",
self.user.userID, escapedToken];
NSURL *url = [[NSURL alloc] initWithString:strUrl] ;
NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
NSURLResponse *resp = nil;
NSError *err = nil;
// Returning [NSMutableArray array] does not cause SIGABRT
NSData *response = [[NSURLConnection
sendSynchronousRequest:urlRequest
returningResponse: &resp
error: &err] retain];
// Returning here does cause a SIGABRT
return [NSMutableArray array];
NSString *xml = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
ShoppingListXmlParser *parser = [[ShoppingListXmlParser alloc] init];
return [parser parseShoppingListXmlData:response];
}
Я знаю, что есть много вещей, которые должны быть освобождены, ноэто проблема с автоматическим выпуском, я только что в отчаянии временно удалил все вызовы выпуска / автоматического выпуска.
Вот вывод отладчика.
...
Canceling call as the malloc lock is held so it isn't safe to call the runtime.
Issue the command:
set objc-non-blocking-mode off
to override this check if you are sure your call doesn't use the malloc libraries or the ObjC runtime.
(gdb) continue
DenGladeMad(619,0xa0c51540) malloc: *** error for object 0x4d3cd40: double free
*** set a breakpoint in malloc_error_break to debug
Program received signal: “SIGABRT”.
(gdb)
Есть какие-нибудь подсказки?