2011-04-08 3 views
0
UITabBarController

Description:avertissement Analyzer: « décrément incorrect du compte de référence » pour

Disons que j'ai une classe qui contient UITabBarController et un groupe de contrôleurs.

Maintenant, l'un des contrôleurs (specialController) n'est pas autorisé à être sélectionné par UITabBarController. Je lui montre de manière différente (mais je veux toujours l'avoir dans viewControllers de UITabBarController)

En déniant specialController à choisir, je me manque init fait par UITabBarController. C'est pourquoi j'appelle le init à la main.

Le problème:

Quand je lance « Build and Analyzie », je reçois d'avertissement

décrément incorrect du compte de référence d'un objet qui est n'appartient pas à ce point par la appelant

dans la ligne avec mon init. Mais, l'application fonctionne. Qu'est-ce que je rate?

code:

dans le 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]; 
    } 
} 

Si je ne suis pas clair, s'il vous plaît laissez-moi savoir :). Merci!

+0

Vous utilisez 'retain' pour augmenter le nombre de références, pas' init' – ughoavgfhw

+0

Huh? Je ne veux pas augmenter le nombre de références, je veux initier le contrôleur. S'il vous plaît, vérifiez ma description :) – Solo

Répondre

0

Comment les contrôleurs de vue entrent-ils dans le tableau tabBarController.viewControllers?

S'ils sont configurés dans le fichier xib, alors init est appelé dans le cadre de leur réanimation depuis le xib et ne devrait plus être appelé. Il est presque jamais le cas que vous voulez appeler init n'importe où sauf directement après avoir appelé alloc. Avoir un objet alloc'd mais unitialized qui traîne semble être une situation très (très!) Rare et peu probable ...

Fondamentalement, avoir un contrôleur dans la liste des contrôleurs de contrôleur d'onglet qui ne fait pas partie de les contrôleurs contrôlés par un contrôleur à onglets semblent être une mauvaise idée de conception - contrer les attentes et la conception de la classe de contrôleurs d'onglets ... et donc causer des problèmes.

+0

Répondre à la question - oui, les contrôleurs sont ajoutés dans le fichier xib. En ce qui concerne le deuxième paragraphe: Je ne suis pas du tout d'accord - pour autant que je comprenne UITabBarController, c'est ce qu'il fait - il n'initialise pas ** les contrôleurs jusqu'à ce que vous les montriez pour la première fois. C'est la raison pour laquelle je l'utilise - pour avoir la gestion de la mémoire de fantaisie hors de mon assiette. Le ** specialController ** est différent, selon la description. – Solo

+0

Je crois que les objets dans un fichier xib sont initialisés puis aplatis avec NSCoder afin que l'init soit effectivement appelé.C'est pourquoi il existe la méthode awakeWithNib: c'est l'endroit où effectuer l'initialisation au démarrage des classes qui sont réanimées à partir d'un fichier xib. Cela dit, je n'ai pas creusé dans UITabControllers en détail. Je les ai juste utilisés dans les cas où ils ont juste travaillé sans aucune étrangeté. – Dad

+0

Si vous créez un contrôleur personnalisé, remplacez sa méthode init pour imprimer simplement quelque chose à consigner, puis ajoutez-le à UITabBarController MAIS ne le sélectionnez jamais - vous ne verrez pas le message init dans le journal. – Solo

Questions connexes