繁体   English   中英

EXC_BAD_ACCESS 错误

[英]EXC_BAD_ACCESS error

我制作了一个应用程序,它应该一直运行,直到我停止它。 它的基本作用是从连接的另一台设备获取一些数据,并使用NSURLConnection定期将该数据发送到服务器,并定期从服务器读取数据并使用NSXMLParser将该数据可视化为图形。

我运行仪器检查分配和泄漏。 完全没有泄漏。 memory 显示器显示一致的 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]; }

另一个可疑的部分是读取数据:


- (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]; }

尝试在启用“Guard Malloc”(在 Xcode 的运行菜单中)的 iPhone 模拟器中运行它。 这是一个特殊设置,旨在使隐藏的内存访问错误导致立即崩溃而不是隐藏一段时间。 (它还会使您的应用程序变得非常慢,并且比正常情况消耗更多的 memory,这就是为什么它并不总是打开的原因。)不确定它是否会有所帮助,但它可能会有所帮助。

UPDATE : The instructions above are for Xcode 3. In Xcode 4, turn on Guard Malloc by clicking your scheme name in the toolbar, selecting "Edit Scheme", clicking "Run" in the sheet's source list, choosing the "Diagnostics" tab,并选中“启用 Guard Malloc”。

如果你得到EXC_BAD_ACCESS那么你大概也会得到一个崩溃日志,这将帮助你找出崩溃的位置。 可能会取消引用指向 memory 的指针,该指针不在起作用 - 例如,不清楚您的aStringurl变量来自何处。 也不清楚您的应用程序是否有多个线程,在这种情况下,您的本地NSAutoreleasePool可能会释放您不希望它没有的东西。 一切都很难说。

使用 Zombies 仪器对其进行分析也会有所帮助,因为它提供了有关引发错误的原因的详细反馈。 例如一个已释放的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM