Я много раз охотился за сообщениями, связанными с NSURLConnection и, в более общем плане, отладкой SIGABRT, но не испытывал радости от этого. Любая помощь с благодарностью.
Итак, при запуске моего приложения пользователю предоставляется вид входа в систему, и при вводе имени пользователя и пароля я запускаю NSURLConnection, выполняя следующие действия в классе LoginService:
-(void)loginWithURLRequest:(NSString*)requestString
{
if(self.mConnection == nil)
{
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestString]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:120.0];
self.mConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
}
}
-(void)discardLoginDataAndPrepareToReceiveMore
{
// Releases old mLoginData and assigns a new empty one.
self.mLoginData = [[NSMutableData alloc] init];
}
-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
[self discardLoginDataAndPrepareToReceiveMore];
}
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
[mLoginData appendData:data];
}
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
[self discardLoginDataAndPrepareToReceiveMore];
[mDelegate onLoginFailure:error];
self.mConnection = nil;
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
[mDataReader performSelector:mDataReaderSelector withObject:mLoginData];
[mDelegate onLoggedInSuccessfully];
self.mConnection = nil;
}
Так что все это прекрасно работает. Проблема в том, что позже я пытаюсь отправить запрос (из другого класса), и вскоре после этого происходит сбой приложения с SIGABRT при загрузке сборки в отдельном потоке, который я не могу отследить до своего кода. Я понимаю, что NSURLConnection запускается в другом потоке и т. Д.
Поэтому я подумал, что, возможно, что-то не так с моим почтовым индексом и заменил его тем же кодом подключения для входа в систему ниже:
NSString* requestString = @"identical URL as before in login";
NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:requestString]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:120.0];
self.mConnection = [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
Та же проблема, поэтому моя последняя попытка состояла в том, чтобы выяснить, не испортил ли что-то первый логин. то есть, возможно, я ничего не знал о соединениях и не очищал должным образом и т. д. Поэтому я отключил первый вход в систему и оставил свой второй вход, а затем он работает нормально, и я получаю свои обратные вызовы в методах делегата и т. д.
Любые советы о том, что я могу делать неправильно. Кажется, что-то, что я не делаю во время / после установления первого соединения, вызывает сбой второго.
Я могу перешагнуть через 2-й NSURConnection в приложении, когда 1-й логин еще присутствует. Фактический сбой происходит вскоре после того, как приложение продолжает работу после установки этого соединения.
В обоих случаях mConnection является (неатомарным, сохраняемым) свойством каждого класса соответственно.
Я понимаю, что есть более эффективные способы обработки нескольких соединений (после моего поиска), которые мне все равно понадобятся в ближайшее время, но мне нужно, чтобы это сработало для демонстрации для клиента, и мне также любопытно, что Я ошибаюсь, если это подразумевает более фундаментальное недопонимание связей и т. д. с моей стороны
Хм, наверное, мне также не хватает знаний о том, как мне следует отлаживать это. Любые инструменты советы для этого будут оценены. Я избегал использования распределений в инструменте производительности, так как SIGABRT не является проблемой, вызванной утечками, если мое понимание верно?
Дополнительно вот стек вызовов:
- # 0 0x90d7e132 в kill
- # 1 0x90d7e124 в килле $ UNIX2003
- # 2 0x90e108e5 в рейзе
- # 3 0x90e2699c в прерывании
- # 4 0x90d23d35 бесплатно
- # 5 0x026fc081 в __CFStringDeallocate
- # 6 0x026fbccb в _CFRelease
- # 7 0x02720c9d в _CFAutoreleasePoolPop
- # 8 0x0004fe67 in - [NSAutoreleasePool release]
- # 9 0x00300e7f в _UIApplicationHandleEvent
- # 10 0x030c4822 в PurpleEventCallback
- # 11 0x027c5ff4 в __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
- # 12 0x02726807 в __CFRunLoopDoSource1
- # 13 0x02723a93 в __CFRunLoopRun
- # 14 0x02723350 в CFRunLoopRunSpecific
- # 15 0x02723271 в CFRunLoopRunInMode
- # 16 0x030c300c в GSEventRunModal
- # 17 0x030c30d1 в GSEventRun
- # 18 0x00304af2 в UIApplicationMain
- # 19 0x0000242c в основном на main.m: 14
Я предполагаю, что это означает (когда я также смотрю на мой комментарий ниже), что я не вызываю alloc для чего-то (возможно, строки) перед тем, как выпустить это?