2013-02-20 73 views
1

我找不到問題出在哪裏,但是這段代碼崩潰了。我是否會釋放任何物體?這段代碼是否被釋放?

settings = [[SettingsViewController alloc] initWithNibName:@"SettingsController" bundle:nil]; 
settings.hidesBottomBarWhenPushed = YES; 

NSArray * arrayWithRootController = [[NSArray alloc] initWithObjects:settings, nil]; 
[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController]; 
[arrayWithRootController release]; 
[settings release]; 

如果我刪除線

[settings release]; 

的應用doesn't崩潰。但我很確定它的正確性。問題可能在另一個地方嗎?

任何想法?非常感謝

+0

你可以發佈崩潰的細節?該錯誤將非常有用。 – Patrick 2013-02-20 16:33:58

+1

@ user1394965你錯了! iOS6不會改變內存管理中的任何內容。我相信你已經將它與自動引用計數混合在一起。 (在iOS4/5中也可以使用它!) – miho 2013-02-20 16:35:06

+0

如果UINavigationController保留其視圖控制器,則此代碼看起來正確。通過使用NSArray工廠方法'-arrayWithObject:'可以簡化一些事情,因爲結果是自動釋放。 – paulmelnikow 2013-02-20 16:36:24

回答

1

你不會在這段代碼中放慢腳步,但顯然有些事情是不對的。將根視圖控制器添加到數組將保留它,但僅限於數組的生命週期。當數組死亡時,它內部的所有對象也會被釋放(我猜這裏發生了什麼)。

幾件事情要嘗試: 首先,確保你把你的數組,其中你以爲你是:

[(UINavigationController*)([self.tabBar.viewControllers lastObject])setViewControllers:arrayWithRootController]; 

你期望[self.tabBar.viewControllers lastObject]是?你確定這是你想要分配你的新陣列的地方嗎?如果接收器無效,您的陣列將不會保留在您的下一行,這意味着視圖控制器也將被釋放。

我不熟悉你的架構,但它似乎是你分配一個視圖控制器的數組視圖控制器。 self.tabBar是一款導航控制器,您可以撥打setViewControllers。但是self.tabBar.viewControllers lastObject ......據推測這是一個視圖控制器,但並不是一個導航控制器,它可能不會響應setViewControllers(在這種情況下它應該會崩潰,除非它是零,我猜它可能是)。

最後,嘗試使用樂器工具「殭屍」來查看是否可以確定無意發佈的來源。

+0

是的,我把數組放在正確的地方,我試着添加另一個視圖控制器而不是「設置」,它沒有崩潰。設置對象中的問題100%肯定 – pdrcabrod 2013-02-20 16:49:07

+1

使用殭屍來查看它被釋放的位置...... – isaac 2013-02-20 16:52:33

+0

[UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:withIndexPath:] thats該對象的ref計數到達的方法-1 – pdrcabrod 2013-02-20 16:56:37