2010-06-02 6 views
1

J'ai un UIViewController générique sur mon application. Tout le UIViewController sur l'application hérite de ce générique. J'essaie d'automatiser la désallocation et la libération des attributs et des IBOutlets en tant que propriétés.Attributs Iterate et IBOutlets d'un UIViewController

que je fais les premiers (attributs) sur méthode dealloc et le second (IBOutlets comme propriétés) sur viewDidUnload.

- (void) dealloc { 
    [_att1 release]; 
    _att1 = nil; 

    [_att2 release]; 
    _att2 = nil; 

    // ... 
} 

- (void) viewDidUnload { 
    self.att1 = nil; // att1 is an IBOutlet 
    self.att2 = nil; // att2 is an IBOutlet 

    // ... 
} 

Existe-t-il un moyen d'itérer tous mes attributs et IBOutlets pour simplifier ces opérations? Je veux éviter de le faire pour chaque sortie et attribut et le déléguer au générique UIViewController.

Merci.

+0

Je ne peux pas empêcher de penser que Apple aurait déjà inclus ce s'il était possible. – Jasarien

Répondre

5

Je ne suis pas sûr que ce soit possible. De plus, je ne suis pas sûr que ce soit une bonne idée. Tout d'abord, pourquoi est-ce impossible? Le mot-clé IBOutlet est uniquement destiné à Interface Builder. IB analyse le code source (ou une indexation interne du code source XCode) pour identifier les IBOutlets disponibles dans une classe. Je ne crois pas qu'il y ait une distinction entre IBOutlet et la propriété régulière dans le code compilé. Ainsi, même si vous trouvez une liste d'attributs ou de propriétés, vous ne pourrez pas faire la distinction entre ceux pour -[UIView viewDidUnload] et dealloc. Deuxièmement, pourquoi ce n'est pas une bonne idée. La gestion de la mémoire est complexe dans Objective-C. Les outils d'Instruments peuvent également aider à déterminer où l'excès de mémoire est alloué et l'analyseur statique Clang (Cmd-Shift-A dans XCode) peut vous aider à trouver des fuites de mémoire potentielles à partir d'objets inédits ou conservés de manière inappropriée. Tout système d'automatisation basé sur l'introspection est certain de perturber l'analyseur statique, sans parler des autres développeurs de votre équipe. C'est un effort noble d'essayer d'automatiser une telle tâche sujette aux erreurs que la gestion de la mémoire, mais je pense que vous feriez mieux de coller avec les outils existants et attendre que le garbage collector trouve son chemin vers l'iPhone à la place.

0

S'ils sont vraiment simplement nommés attr1, attr2, attr3 ... que vous pouvez.

Utilisez la valeur clé de codage

Par exemple:

for(int i = 1; i <= numberOfAttributes; ++i) { 

    [self setValue: nil forKey: [NSString stringWithFormat: @"%@%i", @"attr", i]]; 
    [[self valueForKey: [NSString stringWithFormat: @"%@%i", @"attr", i] release]; 
} 

Notez que vous devez définir vous-même numberOfAttributes.


Mais si vous ne pouvez pas garder une trace des nubmer d'attributs ou il y a à beaucoup, vous devriez penser à utiliser un tableau pour les rassembler

0

Essayez d'obtenir toutes les IBOutlets en utilisant [self.view subviews] et parcourir le tableau pour les supprimer.

Pour les attributs, je suis toujours à la recherche ...

+0

Vous ne devez pas accéder à la propriété self.view dans viewDidUnload. Si vous le faites, la vue sera automatiquement rechargée.Et vous fuiriez toutes les sous-vues de vos vues, car après le rechargement, il n'y a plus moyen d'obtenir leurs pointeurs – tonklon

+0

Obtenez tous les IBOutlets dans viewDidLoad pour les supprimer plus tard. – MathieuF

Questions connexes