2011-04-08 34 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