La substitution initialize()
est courante pour l'exécution du code avant qu'une classe ne reçoive son premier message (réglage UserDefaults, etc.). La documentation indique qu'une mise en œuvre de superclasse peut être appelée sous-classes multiples fois ne sont pas prioritaires initialize()
et donnent un exemple d'un moyen de protéger une classe de l'exécution du code plus d'une fois si initialize()
est appelée à plusieurs reprises:Redéfinition de l'initialisation sur un AppDelegate - Protection contre l'exécution répétée du code
Le l'implémentation de la superclasse peut être appelée plusieurs fois si les sous-classes n'implémentent pas
initialize()
- l'exécution appelle l'implémentation héritée - ou si les sous-classes appellent explicitement[super initialize]
. Si vous voulez vous protéger d'être plusieurs fois exécuter, vous pouvez structurer votre mise en œuvre le long de ces lignes:+ (void)initialize { if (self == [ClassName self]) { // ... do the initialization ... } }
Je PRÉPONDÉRANTS initialize()
dans mon AppDelegate et en essayant d'éviter le code avoir couru plus d'une fois. Le contrôle de classe n'a pas de sens pour moi, en vérifiant si self is AppDelegate.Type
va toujours évaluer à vrai (et me donne un avertissement dans Xcode).
Est-ce que la vérification de la classe ne s'applique pas, puisque nous ne sommes pas dans une superclasse (la superclasse de AppDelegate
est UIResponder
)? Est-ce que le contenu de ma méthode initialize()
surchargée ne s'exécutera qu'une seule fois sans appeler super
ou effectuer une vérification de classe?
Je pense que si vous utilisez '===' au lieu de 'is', cela ne retournera pas true pour les sous-classes de' AppDelegate'. – dan
@dan Hmm, je n'ai pas envisagé de comparer les références. C'est aussi une bonne option, et protège contre les sous-classes. Vous devriez publier cela comme une réponse. – JAL
Ou 'if self == AppDelegate.self'. Mais tant que vous ne sous-classez pas AppDelegate, vous n'avez pas besoin de cette vérification. –