2012-02-15 19 views
1

參照here的問題。「EXC_BAD_ACCESS:無法恢復先前選定的框架」 - 堆棧變量未清理

在該線程提供的解決方案,包括:

  1. 聰明在哪裏,有多少變量聲明,將進入堆疊。
  2. 如果需要禁用Guard Malloc。

而且,一般而言: 3.確保你釋放你實際上是分配的內存變量!

我沒有上述問題。我在函數中使用的堆棧分配的變量非常少,每個變量都有2-3個。但是因爲函數在循環中被調用了好幾次,它似乎會觸發一個異常。

這裏是踢球者,這不僅僅發生在靜態分配的變量上,而且還在堆上!我在自動發佈的NSNumber變量聲明中發現了頁面錯誤,這些變量我在循環中使用了幾個變量,還有一個字典,我每次調用它時都會在函數範圍內分配和釋放字典。

那麼爲什麼會發生這種情況,爲什麼heck變量會受到影響?我一點都不明白,請在此點亮一下。 :)

我在IOS5與XCode 4.2,iPhone/iPad模擬器。

謝謝!

問候, 開發

編輯:示例代碼
- (void)doSomething {
NSInteger fun = 3;
NSInteger time = 4;
NSInteger overload = fun*time;
NSString *string = [NSString stringWithFormat:@"%d",overload];
NSObject *myCustomObject = [[NSObject alloc] init];
[myCustomDictionary setObject:myCustomObject forKey:string];
[myCustomObject release];
//myCustomDictionary is an iVar, alloced in the class's init method, and released in dealloc and not touched anywhere in between
}
//doSomething gets called several times through the course of execution as the state of the view changes, the user interacts with it etc, often 2-3 times during one state change.

的代碼是故意模糊的,但在同一時間,這是完全一樣的樣品中一樣簡單。正如整個項目的其他代碼一樣。幾個功能,每個都做少量的工作,就像這一個很好的自我包含記憶一樣。

我之前遇到過EXC_BAD_ACCESS問題,並且在那個時候提到了this問題。然而就我而言,我並沒有在一個循環內的堆棧上創建多個變量,而是通過一個在執行過程中多次調用的函數重複創建它們。理想情況下,變量應該在函數範圍的末尾被銷燬。不知道爲什麼沒有發生。

無論如何,爲了解決這個問題,爲了防止發生多次分配,我最終聲明瞭我的堆棧分配變量全部爲static。這是不好的做法,但這正是我必須做的工作。它一直在運轉,直到我終於用「doSomething」函數面對這個問題。

所以「doSomething」的困難在於我沒有創建堆棧分配的變量,而是堆了一些東西。所以我首先開始在NSInteger變量上獲取EXC_BAD_ACCESS,在這一點上,我試着再次修復它,聲明它們是靜態的。它的工作,但現在EXC_BAD_ACCESS開始發生在自動釋放變量,最後是自定義分配的變量 - 這是當我陷入困境。我一直遵循內存管理的所有規則,而且我有堆棧和堆變量在我身上流竄。如果只是堆東西,或者將東西堆放在一個循環中,我可以理解某處有錯誤。但是在這裏,它既不是,也不是在循環中調用的ONE函數內的堆棧中分配的完全無辜的變量,以及從未獲得的常規自動釋放變量將保留或釋放到代碼中的其他位置。更糟糕的是,失敗點是隨機的 - 不僅僅是在這個功能中,實際上每一個在項目執行過程中被調用了幾次。

編輯2:原來,在這種情況下,這是我的錯。詳情請參閱我的回答。對不起浪費人們的時間。 :\

回答

0

啊geez我不相信這一點。

以前用堆棧分配的NSInteger變量面臨的問題是成立的,但在這種情況下,這完全是我的錯。

「DoSomething的」是事件的長鏈的一部分,即,由於對我而言有些愚蠢的過失,結束了循環一堆倍,這是什麼,理所當然,當它應該是,導致應用程序內存不足。無論是堆棧變量還是坐在堆上的混合變量,無限循環,都會以某種方式崩潰。 :)

因此,崩潰是完全公平的,只是在這種情況下與以前的問題,結果是無關的混淆。 :(

對不起,浪費大家的時間。

0

沒有張貼在你的問題的任何代碼,看到你正在使用的是iOS 5和Xcode的4.2我最好的建議對你的,在Xcode,去Edit>Refactor>Convert to Objective-C ARC和波所有的內存管理問題再見。

ARC爲您做所有的內存管理。您不需要保留,發佈或編寫dealloc方法。在大多數情況下,您不必擔心內存管理。你將離開神祕的EXC_BAD_ACCESS崩潰。它的工作方式是超高效的。編譯器會爲您保留併發布,然後進行優化。你甚至不需要看代碼。

+0

這些問題與靜態分配的對象和純粹自動釋放的對象有關,而不是定製發佈的對象,所以我懷疑ARC會有所幫助。如果有幫助,我可以用一些示例代碼編輯問題。 – 2012-02-16 03:44:31

1

我們不能真正幫助你沒有看到整個堆棧跟蹤。 EXC_BAD_ACCESS並不意味着爲了解決我們需要知道的例外是什麼東西。 。

根據我的經驗,當你沒有得到一個堆棧tarce這意味着你是雙釋放殭屍是要找到你的雙重釋放的方式

轉到:Product -> Profile,然後選擇「Zombies」從清單 運行應用程序並執行導致崩潰的任何任務,如果問題是雙重發布,則會顯示彈出窗口。選擇彈出框中的箭頭,它會告訴你到底是什麼對象被雙重釋放,並向您顯示保留週期。

+0

請參考我的回答。我現在無法接受它,因爲看起來我只能在提問後兩天接受我自己的回答,或者類似的問題。 – 2012-02-16 11:18:52

+0

正如我所提到的,殭屍將適用於在堆中聲明的對象。我也面臨着與STACK變量相同的問題,所以它不是保留/發佈問題,就像應用程序在無限循環的x次迭代後內存耗盡一樣,我的答案中已澄清。 – 2012-02-16 11:20:26