我在与 NSURLConnection 和更普遍的 SIGABRT 调试有关的帖子上搜索了很多,但对此并不满意。任何帮助是极大的赞赏。
因此,在我的应用程序开始时,用户会看到一个登录视图,并在提供用户名和密码时,我通过在 LoginService 类中执行以下操作来启动 NSURLConnection:
-(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;
}
所以这一切都很好。问题是稍后我尝试 POST 一个请求(来自不同的类中),不久之后,应用程序在一个单独的线程上的程序集负载中使用 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];
同样的问题,所以我最后一次尝试是查看第一次登录是否以某种方式搞砸了。即,也许我对连接一无所知,并且没有正确清理等。所以我禁用了第一次登录并留下了我的第二次登录,然后它工作正常,我在委托方法等中获得了回调。
关于我可能做错的任何提示。在第一次连接期间/之后,我似乎没有做某事导致第二次连接崩溃。
当第一次登录仍然存在时,我可以跳过应用程序中的第二个 NSURConnection。在建立此连接后告诉应用程序继续后不久,就会发生实际崩溃。
在这两种情况下,mConnection 分别是每个类的(非原子的,保留的)属性。
我意识到有更好的方法来处理多个连接(在我四处搜索之后),无论如何我都需要尽快使用它们,但我需要让它为客户的演示工作,并且我也很好奇出了什么问题情况下,这意味着我对连接等有更根本的误解。
嗯,我想我也缺乏关于如何调试它的知识。对此的任何仪器提示将不胜感激。我避免在性能工具中使用分配,因为如果我的理解正确,SIGABRT 不是由泄漏引起的问题?
另外这里是调用堆栈:
-#0 0x90d7e132 in kill
-#1 0x90d7e124 in kill$UNIX2003
-#2 0x90e108e5 in raise
-#3 0x90e2699c in abort
-#4 0x90d23d35 in free
-#5 0x026fc081 in __CFStringDeallocate
-#6 0x026fbccb in _CFRelease
-#7 0x02720c9d in _CFAutoreleasePoolPop
-#8 0x0004fe67 in -[NSAutoreleasePool release]
-#9 0x00300e7f in _UIApplicationHandleEvent
-#10 0x030c4822 in PurpleEventCallback
-#11 0x027c5ff4 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
-#12 0x02726807 in __CFRunLoopDoSource1
-#13 0x02723a93 in __CFRunLoopRun
-#14 0x02723350 in CFRunLoopRunSpecific
-#15 0x02723271 in CFRunLoopRunInMode
-#16 0x030c300c in GSEventRunModal
-#17 0x030c30d1 in GSEventRun
-#18 0x00304af2 in UIApplicationMain
-#19 0x0000242c in main at main.m:14
我认为这意味着(当我还查看下面的评论时)我在发布之前没有在某些东西(可能是字符串)上调用 alloc?