2010-08-10 7 views
1

Est-il préférable d'avoir des constructeurs statiques où vous allouez l'instance dans le constructeur et renvoyez l'instance en tant que libération automatique, par ex. [String stringWithFormat...] ou est-il préférable d'avoir des constructeurs dynamiques où vous demandez à l'utilisateur d'attribuer d'abord afin qu'il est en charge de la libération? Quand devriez-vous utiliser chacun?Constructeurs Objective C statiques vs. dynamiques

Vive

Répondre

1

Je ne sais pas si “ statique ” et “ dynamique ” sont les termes appropriés.

[NSString stringWithFormat:...] est une méthode pratique. Si vous voulez une chaîne formatée que vous ne garderez pas très longtemps, vous pouvez utiliser cette méthode de commodité pour éviter le fouillis que alloc + initWithFormat: + release peut introduire dans votre code [autrement simple].

[[NSString alloc] initWithFormat:...] est parfois plus clair au lecteur que la durée de vie de cet objet sera traité explicitement (par exemple avec un release plus tard), bien que, je l'ai trouvé, il est pas rare de rencontrer un [[[NSString alloc] initWithFormat:...] autorelease] dans les lieux. Lorsque vous concevez une classe, vous devez déterminer si les instances de votre classe sont destinées à être utilisées fréquemment/rapidement plutôt qu'à long terme (ou les deux). Si vous considérez que vos cours peuvent être utilisés fréquemment ou rapidement, la méthode pratique vous aidera à réduire l'encombrement et à simplifier le code qui utilise la classe.

Par exemple, NSWindow n'est pas une classe que vous créez et supprimez les instances de fréquemment, donc il n'y a pas de méthodes pratiques pour créer NSWindow cas, vous devez passer par le alloc + init itinéraire (en fait, NSWindow n'est pas normalement une classe que vous devez créer des instances de manuellement de toute façon). D'un autre côté, les chaînes, les tableaux, les dictionnaires, les décors, etc., ce sont des choses souvent créées et souvent jetées, donc elles ont toutes des méthodes pratiques qui facilitent leur création et leur gestion.

+0

Merci beaucoup. C'était exactement ce que je recherchais. – ar106

4

D'abord, il n'y a pas une telle chose comme un "constructeur" en Objective-C. Il n'y a pas non plus de "constructeurs statiques contre dynamiques". Vous avez la souillure C++ et cela entrave votre capacité à comprendre Objective-C! :)

Vous voudrez lire (et relire) le memory management guide. Notamment spécifique à votre question, si vous avez une méthode de classe comme +stringWithFormat:, alors cette méthode devrait renvoyer une instance auto-libérée. Généralement, il serait mis en œuvre comme:

+ stringWithFoo: (Foo *) aFoo 
{ 
    return [[[self alloc] initWithFoo: aFoo] autorelease]; 
} 

(légèrement simplifié pour éviter le bruit de varargs).

+0

Merci beaucoup. C'est vrai, je suis un nouveau programmeur objectif avec une mentalité C++. :) – ar106

Questions connexes