2010-11-22 44 views
0

我在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

我认为,这意味着(当我看看下面还我的评论),我不是要求在我释放之前在某些东西(也许是一个字符串)上进行分配

+0

嗯从控制台多一点信息:prjname(1482,0xa00f54e0)的malloc:***错误对象0x818c0b0:被释放的指针没有被分配 ***在malloc_error_break设置一个断点调试 程序接收到的信号:“ SIGABRT”。 注意:我没有在这个项目中使用任何c或C++代码,它都是客观的c,所以它必须是由sdk代码或其他东西创建的对象。 – jMax 2010-11-22 13:01:18

回答

0

您是否启用了启用僵尸的应用程序?它可能是一个过度释放,僵尸会回升。

追踪这种情况的另一种方法是启用malloc历史记录,并检查错误指针(评论中的0x818c0b0)来自哪里。

这可能对你有用:iPhone - debugging "pointer being freed was not allocated" errors

看起来好像内存被一个CFString/NSString对象,这意味着它可以出现的地方,看起来完全不相关的内部损坏。你可能会传递一个坏指针到NSString,所以你可能也想检查一下。

另外,mDataReaderSelector的值是多少?如果您执行performSelector:并且该方法返回可能会损坏内存的结构(例如NSRect)。这是一个远射,但我认为我会检查。

0

这是一个很难找到没有整个源代码的地方,但似乎你正在调用NSString对象的第二个(和无效的)版本。看看你在整个项目中如何对待字符串。请确保它们在属性声明中具有“复制”属性,并且不会不必要地释放已经自动释放的属性。 (即创建[NSString stringWithFormat:])

0

启用僵尸后(我认为只跟踪泄漏,而不是双释放/ autoreleases)后修复。我正在autoreleasing一个不需要它的字符串。

感谢TomDalling和drowntoge,你们都在正确的轨道上。我刚到那里,然后看到了你的答案(正如我发布的那样),无论如何,这肯定会让我很快到达那里。我不知道stringWithFormat autoreleased并无论如何autoreleasing。只有真正开始使用自动释放,并用于分配给本地人,并在将所述本地分配给我的保留属性后释放它们。在代码中,这也不算太好。我想,在我没有意识到之前,我有很多漏洞。我已经阅读了关于内存的文档,但是从未使用autorelease,所以我认为我需要再次回顾一下:-)

仍然不知道初始连接如何在启用后显示问题第二次连接是晚些时候。因为我认为这完全是关于我对连接的理解。有问题的字符串在这个代码中和周围。嗯 无论如何,欢呼的家伙。

相关问题