2011-01-20 83 views
0

所以我覺得現在是一個嚴肅的菜鳥,但我有一個問題,我似乎無法弄清楚。我有一個準系統應用程序,除了登錄屏幕和包含桌面視圖的第二個視圖外幾乎沒有任何內容。當我登錄後添加第二個視圖時(我在之前做過4次這樣的操作),表視圖通過它的委託並顯示它將加載,但是會發生一些事情。我已經啓用了我的NSZombies,並且在它出現之前它似乎正在釋放新的視圖。iPhone - 加載一個新視圖和一個釋放對象

在遍歷它並逐個構建之後,在將表格作爲IB中的數據源/代理連接到視圖後,似乎發生了這種情況。我已經將視圖設置爲UITableViewDelegate,並且方法確實被解僱了。有沒有人有任何想法可能會導致這種行爲?

+0

你在做一些奇怪的視角雜耍,導致視圖不被保留在第一位? – Brian 2011-01-20 21:25:50

+0

當你說「第二視圖」時,你的意思是你展示的UIView或UIViewController? – 2011-01-20 22:06:47

回答

1

您是否使用addSubview將「second」視圖添加到現有視圖中:或者將其添加到某種形式的UINavigationController或UITabBarController?當你這樣做時,它會自動增加保留計數,並且釋放視圖的任何代碼都不會被釋放。

在我的AppDelegate應用程序中:didFinishLaunchingWithOptions我有類似的東西;

LoginViewController *login = [[LoginViewController alloc] init];  
[login setDelegate:self]; 

loginNavController = [[UINavigationController alloc]  
         initWithRootViewController:login]; 

[window addSubview:[loginNavController view]]; 

然後一旦登錄已發生(和使用協議/委託發送回的AppDelegate消息成功)我把這種代碼;

UIViewController *newView1 = [[UIViewController alloc] init]; 
UIViewController *newView2 = [[UIViewController alloc] init]; 
UIViewController *newView3 = [[UIViewController alloc] init]; 

myTabBarController = [[UITabBarController alloc] init]; 

myNavController = [[UINavigationController alloc] 
        initWithRootViewController:newView1]; 

// nav controller now retaining 
[newView1 release]; 

NSArray *viewControllers = [NSArray arrayWithObjects:myNavController, 
                newView2, 
                newView3, 
                nil]; 

[myTabBarController setViewControllers:viewControllers animated:YES]; 
[[myTabBarController view] setFrame:[[UIScreen mainScreen] applicationFrame]]; 

[window addSubview:[tabBarController view]];  

// tab bar controller now retaining 
[newView2 release]; 
[newView3 release]; 

// remove login from application 
[[loginNavController view] removeFromSuperview]; 

AppDelegate在頭文件中聲明如下:

LoginViewController *loginViewController; 
UITabBarController *myTabBarController; 
UINavigationController *myNavController; 

在AppDelegate的dealloc方法中,這些被釋放。

這給了我我的登錄頁面,然後當它已經處理我的視圖與頂部導航全部控制使用底部標籤欄。

希望這有助於某種方式。

0

你要麼太多release(或autorelease)調用 - 或沒有足夠的retain電話 - 在你看來裝載/轉換代碼,但它不可能是沒有看到該代碼更加具體。

可能發生的情況是autorelease池在您的視圖加載和顯示的視圖之間被刷新,這就是您所描述的行爲的主要原因。

相關問題