我创建了一个应该运行的应用程序,直到我停止它.它基本上做的是从连接的另一个设备获取一些数据NSURLConnection
,并定期使用该数据发送到服务器,并定期从服务器读取数据,并使用图形将该数据可视化NSXMLParser
.
我运行仪器来检查分配和泄漏.完全没有泄漏.内存监视器显示一致的5.2 MB.Objectalloc图是稳定的,objectallo的净字节是480000,#net是6400左右.
它在大约10~15小时后坠毁.所以我添加了断点malloc_error_break
.现在,EXC_BAD_ACCESS
大约12小时后,我在调试器控制台上出现" "错误.
任何的想法?
一个可疑的部分是SENDING数据.
- (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]; }
另一个可疑部分是阅读数据:
- (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]; }
尝试在iPhone模拟器中运行它,并启用"Guard Malloc"(在Xcode的"运行"菜单中).这是一个特殊的设置,旨在使隐藏的内存访问错误导致立即崩溃而不是隐藏一段时间.(这也会使你的应用程序变得非常慢并且消耗的内存比正常情况多得多,这就是为什么它并不总是开启.)不确定它会有所帮助,但它可能会有所帮助.
更新:上述说明适用于Xcode 3.在Xcode 4中,通过单击工具栏中的方案名称,选择"编辑方案",单击工作表源列表中的"运行",选择"诊断"选项卡,打开Guard Malloc,并选中"启用Guard Malloc".