我创建了一个应该运行的应用程序,直到我停止它为止。它基本上做的是从连接的另一台设备获取一些数据,并使用NSURLConnection
定期将数据发送到服务器,并定期从服务器读取数据,并使用NSXMLParser
将该数据显示为图形。
我运行仪器来检查分配和泄漏。完全没有泄漏。内存监视器显示一致的5.2 MB。 Objectalloc图是稳定的,objectallo的净字节是480000,#net是6400左右。
大约10~15小时后坠毁。所以我在malloc_error_break
添加了断点。
现在,大约12小时后,我在调试器控制台上出现“EXC_BAD_ACCESS
”错误。
有什么想法吗?
一个可疑部分是发送数据。
- (void) sendDataToServerWithX:(float)x Y:(float)y{
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init];
NSString *urlString = [[NSString alloc] initWithFormat:@"http://www.url.com/save_data.php?user=user1&x=%f&y=%f", x, y];
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) { NSLog(@"sending success"); }
//else { }
NSLog( @"data sent.");
[urlString release];
[theConnection release];
[uiUpdatePool drain];
}
另一个可疑部分是 READING 数据:
- (void) readCurrentDataFromServer: (NSTimer *) timer {
NSAutoreleasePool *uiUpdatePool = [[NSAutoreleasePool alloc] init];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
NSURL *url = [[NSURL alloc] initWithString:aString];
NSXMLParser *readXmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
[readXmlParser setDelegate:parser];
[readXmlParser parse];
(...)
[parser release];
[url release];
[readXmlParser release];
[uiUpdatePool drain];
}
答案 0 :(得分:9)
尝试在iPhone模拟器中运行它,并启用“Guard Malloc”(在Xcode的“运行”菜单中)。这是一个特殊的设置,旨在使隐藏的内存访问错误导致立即崩溃而不是隐藏一段时间。 (这也会使你的应用程序变得非常慢并且消耗的内存比正常情况多得多,这就是为什么它并不总是开启。)不确定它会有所帮助,但它可能会有所帮助。
更新:上面的说明适用于Xcode 3.在Xcode 4中,通过单击工具栏中的方案名称,选择“编辑方案”,单击工作表中的“运行”来打开Guard Malloc。源列表,选择“诊断”选项卡,然后选中“启用Guard Malloc”。
答案 1 :(得分:1)
如果你得到EXC_BAD_ACCESS
,那么你可能会得到一个崩溃日志,这将帮助你找出崩溃的位置。可能解除引用指向不存在的内存的指针 - 例如,不清楚aString
或url
变量的来源。还不清楚你的应用程序是否有多个线程,在这种情况下,你的本地NSAutoreleasePool
可能会释放你不喜欢的东西。一切都很难说。
答案 2 :(得分:1)
使用Zombies仪器进行分析也可以提供帮助,因为它提供了有关错误的详细信息。例如,一个解除分配的数组。