參照here的問題。「EXC_BAD_ACCESS:無法恢復先前選定的框架」 - 堆棧變量未清理
在該線程提供的解決方案,包括:
- 聰明在哪裏,有多少變量聲明,將進入堆疊。
- 如果需要禁用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:原來,在這種情況下,這是我的錯。詳情請參閱我的回答。對不起浪費人們的時間。 :\
這些問題與靜態分配的對象和純粹自動釋放的對象有關,而不是定製發佈的對象,所以我懷疑ARC會有所幫助。如果有幫助,我可以用一些示例代碼編輯問題。 – 2012-02-16 03:44:31