我创建了一个应该运行常量的应用程序,直到停止为止。它主要做的是从连接的另一个设备中获取一些数据,并定期使用NSURLConnection将数据发送到服务器,并定期从服务器读取数据,并使用NSXMLParser将数据可视化为一个图形。
我用仪器检查配给和漏水情况。一点也不漏水。内存监视器显示一致的5.2MB。Objectalloc图是稳定的,对象的净字节是arouend 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];
}
Another suspicious part is READING data:
- (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];
}发布于 2009-02-26 00:16:46
尝试在启用"Guard“(在Xcode的Run菜单中)的iPhone模拟器中运行它。这是一个特殊的设置,旨在使隐藏的内存访问错误立即崩溃,而不是隐藏一段时间。(这也会使你的应用程序非常慢,比正常情况下消耗更多内存,这就是为什么它并不总是开着的原因。)它不确定它会有帮助,但它有可能。
UPDATE:上面的说明用于Xcode 3。在Xcode 4中,单击工具栏中的方案名称,选择“编辑方案”,单击工作表的源列表中的"Run“,选择”诊断“选项卡,并检查”启用保护Malloc“。
发布于 2009-02-26 00:12:06
如果您得到了EXC_BAD_ACCESS,那么您可能还会得到一个崩溃日志,这将帮助您确定崩溃的位置。可能取消引用一个指向内存的指针,而这个指针不起作用--例如,不清楚aString或url变量来自何处。也不清楚你的应用程序是否有多个线程,在这种情况下,你的本地NSAutoreleasePool可能会发布你不希望它发布的东西,这一切都很难分辨。
发布于 2011-12-29 23:04:10
使用僵尸仪器对其进行分析也会有所帮助,因为它提供了详细的反馈,说明是什么导致了错误。例如,已分配的数组。
https://stackoverflow.com/questions/588445
复制相似问题