我在NSURLConnection和更一般的SIGABRT调试的帖子上搜寻了很多,但对此没有任何喜悦。任何帮助是极大的赞赏。第二次使用NSURLConnection会导致SIGABRT iPhone
-(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;
}
所以这一切:
所以,在我的应用程序的启动用户会看到一个登录视图和提供的用户名和密码,我做的login服务类中的下列启动NSURLConnection的工作得很好。问题是后来我试图发布一个请求(从一个不同的类中),不久之后,应用程序崩溃了一个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不是由泄漏导致的问题?
此外,这里的调用堆栈:
- 在中止
#3 0x90e2699c - #0 0x90d7e132在杀
- #1 0x90d7e124在杀$ UNIX2003
- 在加注#2 0x90e108e5
- #4 0x90d23d35在自由
- #5 0x026fc081在__CFStringDeallocate
- #6 0x026fbccb在_CFRelease
- #7 0x02720c9d在_CFAutoreleasePoolPop
- #8 0x0004fe67中 - 在__CFRunLoopDoSource1
#12 0x02726807 - - [NSAutoreleasePool释放]
- #9 0x00300e7f在_UIApplicationHandleEvent
- #10 0x030c4822在PurpleEventCallback
- #11 0x027c5ff4在__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
#13 0x02723a93在__CFRunLoopRun
- #14 0x02723350在CFRunLoopRunSpecific
- #15 0x02723271在CFRunLoopRunInMode
- 在GSEventRunModal
#16 0x030c300c - #17 0x030c30d1在GSEve ntRun
- #18 0x00304af2在UIApplicationMain
- 在主#19 0x0000242c在main.m文件:14
我认为,这意味着(当我看看下面还我的评论),我不是要求在我释放之前在某些东西(也许是一个字符串)上进行分配
嗯从控制台多一点信息:prjname(1482,0xa00f54e0)的malloc:***错误对象0x818c0b0:被释放的指针没有被分配 ***在malloc_error_break设置一个断点调试 程序接收到的信号:“ SIGABRT”。 注意:我没有在这个项目中使用任何c或C++代码,它都是客观的c,所以它必须是由sdk代码或其他东西创建的对象。 – jMax 2010-11-22 13:01:18