2010-07-13 3 views
3

En écrivant un certain Objective-C dans une méthode, j'appelle le +alloc, puis -init pour mettre en place un objet.Comment puis-je m'assurer qu'un objet a fini de s'initialiser avant de l'utiliser?

object = [[MyClass alloc] init]; 
[object useFor:whatever]; 

Les lignes de code suivantes utilisent l'objet nouvellement créé. Si le -init mentionné ci-dessus prend trop de temps, je suis sûr que le programme n'attendra pas avant de commencer à utiliser le nouvel objet, n'est-ce pas? Si non, y a-t-il un moyen rapide d'assurer que le -init est complété?

Je vois parfois des programmeurs qui écrivent quelque chose le long des lignes de

if(object = [[MyClass alloc] init]) { 
    [object useFor:whatever]; 
} 

Est-ce que je devrais aller?

Répondre

3

En règle générale, les instructions dans les fonctions (et méthodes) C et Objective-C sont exécutées en séquence, dans l'ordre où vous les écrivez. Si vous écrivez une chose avant une autre dans une fonction, la première doit terminer l'exécution avant que la suivante puisse s'exécuter.

Le compilateur peut réorganiser les instructions s'il croit que cela ne changera pas le comportement du programme (qu'il peut très bien prédire dans les situations qui n'impliquent pas la simultanéité), mais c'est une optimisation. Le standard C traite les instructions comme étant séquentielles, mais permet aux compilateurs de les implémenter comme bon leur semble tant que le comportement du programme réel est le même que si les instructions avaient été exécutées dans la séquence dans laquelle elles étaient écrites. Tout ceci est un long chemin de dire: Votre méthode init se terminera avant que la méthode appelante puisse reprendre l'exécution.

+0

Merci, c'est très utile. J'ai pensé que les appels de méthode (ou les envois de messages) se comportaient différemment, mais maintenant je réalise que ce n'est pas le cas. –

4

commandes sont exécutées dans un ordre séquentiel et non Paralell

(mec, apprendre quelques notions de base;)

+1

Hé, merci. Pour être juste, la littérature de base dans ObjC va généralement "REGARDER SON ÉDITEUR DE TEXTE SANS CODE OMG" et échouer la théorie. –

9

Lorsque vous appelez init le programme ne passera pas à la ligne suivante jusqu'à ce que la méthode retourne init. Au moment où vous avez atteint la deuxième ligne, la méthode init est terminée. Il ne peut pas avoir terminé avec succès, mais il aura terminé.

La seconde forme est un test. D'abord, l'instruction if appelle la méthode init. Si un objet valide est retourné alors le test est vrai et ensuite l'instruction suivante est exécutée. C'est pourquoi vous voyez les méthodes init qui renvoient self lorsqu'elles sont réussies et nil lorsqu'il y a un problème; afin que des tests comme ceux-ci puissent être exécutés pour être sûr que l'objet a été initialisé avec succès avant de continuer.