簡體   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