1

我的問題與我發現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有一個基本的誤解?請幫忙。

回答

3

它可能與您的視圖控制器的兩個實例使用相同的靜態分配變量有關。

換句話說,myViewController_1stInstancemyViewController_2ndInstance在內存中使用相同的variable1位置並相互覆蓋。

聲明的花括號內的@interface定義後的變量是由運行時爲每次調用[<ClassName> alloc]時間類的每個實例(分配的存儲空間。在全球範圍內聲明的變量(即,任何功能外或類別聲明)就是:global。這意味着變量只能爲每個應用程序的運行副本保留一個值

Objective-C中沒有真正的私有變量,但可以將它們隱藏在其他實例中在編譯時所描述的here

+0

這也是我一開始就猜測的。但事實並非如此。 – 2010-05-11 00:26:34

+0

即使您確定靜態變量不會導致問題,對每個實例數據使用靜態變量也是一個壞主意。這就是成員變量的用途。 – 2010-05-11 00:30:23

+0

它們不是靜態的。要聲明靜態變量,請輸入如下內容: static NSString variable1; – 2010-05-11 00:37:31

1

有點晚了反應,但我之前看過這個問題。不要同時推動兩個viewControllers動畫。推動第一個沒有動畫,並推動第二個與動畫。 UINavigationController無法同時處理兩個動畫。

+0

或彈出第一個沒有動畫,並推動第二個與動畫。 – ChildhoodAndy 2015-10-15 11:24:15

相關問題