2011-04-08 29 views
0

說明「引用計數錯誤減量」:分析儀警告:對的UITabBarController

比方說,我有一個包含UITabBarController和一堆控制器的一類。

現在,其中一個控制器(特殊控制器)不允許被UITabBarController選中。我告訴他在不同的方式(但我還是希望有他在UITabBarControllerviewControllers

通過禁止specialController被選中,我很想念init通過UITabBarController完成。這就是爲什麼我親自撥打init

問題:

當我運行「生成和Analyzie」,我收到警告

的對象,在這一點由 不擁有的引用計數錯誤減量來電

符合我的init。但是,該應用程序的工作。我錯過了什麼?

代碼:

在ClassA.m

//called in viewDidLoad 
- (void)makeVoodooOnViewControllers { 
    //set all variables etc. 
    for (int i = 0; i<controllersCount; i++) { 
     UIViewController *tabViewController = [tabBarController.viewControllers 
                  objectAtIndex:i]; 
    //CUT - some irrelevant code 

    if ([tabViewController isKindOfClass:[specialController class]]) { 
     //line below throws a warning 
     specialControllerProperty = [((specialController *)tabViewController) init]; 
    } 
} 

如果我不清楚,請讓我知道:)。謝謝!

+0

您使用'retain'來增加引用計數,而不是'init' – ughoavgfhw 2011-04-08 03:02:54

+0

咦?我不想增加引用計數,我想'init'控制器。請檢查我的描述:) – Solo 2011-04-08 03:15:54

回答

0

視圖控制器如何進入tabBarController.viewControllers數組?

如果它們是在xib文件中設置的,那麼調用init是將它們從xib重新生成它們的一部分,並且不應該再次調用。除非你直接調用alloc之外,否則你幾乎不想在任何地方調用init。有一個alloc'd但單元化的對象掛在一起似乎是一個非常(很!)罕見的,不太可能是理想的情況....

基本上,有一個控制器在選項卡控制器控制器列表不屬於選項卡控制器控制的控制器看起來是一個糟糕的設計理念 - 反對選項卡控制器類的期望和設計......因此可能導致問題。

+0

回答問題 - 是的,控制器被添加到xib文件中。 至於第二段: 我有點不同意 - 據我瞭解UITabBarController,這就是它在做什麼 - 它沒有**初始化控制器,直到你第一次顯示他們。這就是我使用它的原因 - 讓我的盤子裏沒有花哨的內存管理。按照說明,** specialController **是不同的。 – Solo 2011-04-08 09:15:25

+0

我相信xib文件中的對象被inited然後用NSCoder壓扁,所以init被有效地調用。這就是爲什麼有awakeWithNib:方法 - 它是執行從xib文件重新生成的類的運行時初始化的地方。這就是說,我還沒有深入到UITabControllers的細節。只是在沒有任何怪異的情況下使用它們。 – Dad 2011-04-09 04:49:36

+0

如果您創建自定義控制器,請覆蓋它的init方法以僅打印某些內容來記錄日誌,然後將其添加到UITabBarController但從不選中它 - 您將不會在日誌中看到init消息。 – Solo 2011-04-11 06:50:05