我的問題與我發現UINavigationController崩潰的原因有關。所以我會首先告訴你關於這個發現。請和我一起裸照。UINavigationController因推送和彈出而崩潰UIViewControllers
問題: 我有一個UINavigationController作爲一個UIWindow作爲子視圖,一個RootViewController的類和定製類MyViewController。下面的步驟將得到一個EXC_BAD_ACCESS,100%可重複:
[myNaviationController pushViewController:myViewController_1stInstance animated:YES];
[myNaviationController pushViewController:myViewController_2ndInstance animated:YES];
打左後衛tapBarItem兩次(蹦出兩個myViewController實例),以顯示RootViewController的。
經過痛苦的半天的嘗試和錯誤,我終於找出答案,但也提出了一個問題。
解決方案:我在.m文件中聲明瞭許多對象作爲聲明私有變量的懶惰方式以避免混亂.h文件。例如,
#impoart "MyViewController.h"
NSMutableString*variable1;
@implement ...
-(id)init
{
...
varialbe1=[[NSMutableString alloc] init];
...
}
-(void)dealloc
{
[variable1 release];
}
由於種種原因,當myViewController_1stInstance的觀點是加載myViewController_2ndInstance的觀點後卸載(但仍然在導航控制器的堆棧)的iPhone OS可能會失去跟蹤這些「懶人專用」變量內存分配。第一次點擊後面的tapBarItem是可以的,因爲myViewController_2ndInstance'view仍然被加載。但是第二次tapBarItem攻擊給了我地獄,因爲它試圖釋放第一例。它稱[變量釋放]導致了Exc_Bad_Access,因爲它隨機指向(鬆散指針)。
要解決此問題很簡單,請在.h文件中將variable1聲明爲@private。
這裏是我的問題: 我一直在使用「懶私有」變量相當長的一段時間了,沒有任何問題,直到他們參與的UINavigationController。這是iPhone OS中的錯誤嗎?或者我對Objective C有一個基本的誤解?請幫忙。
這也是我一開始就猜測的。但事實並非如此。 – 2010-05-11 00:26:34
即使您確定靜態變量不會導致問題,對每個實例數據使用靜態變量也是一個壞主意。這就是成員變量的用途。 – 2010-05-11 00:30:23
它們不是靜態的。要聲明靜態變量,請輸入如下內容: static NSString variable1; – 2010-05-11 00:37:31