6
votes

Initwith méthodes par rapport aux méthodes d'usine

Je ramasse Objc et Cocoa, qui est également mon premier inconvénient sérieux dans la programmation en général.

Je rencontre des difficultés avec les différences entre les méthodes inadbith, qui sont appelées sur des instances et des méthodes d'usine, appelées classes.

Tout d'abord, pourquoi s'appelle-t-on des méthodes "usine" et y a-t-il un terme approprié pour ce que j'ai surtout "initwith" méthodes?

Deuxièmement, quelle est la différence fonctionnelle? N'est-ce que les implications de la gestion de la mémoire (que les méthodes d'usine renvoient un objet Autorélied)?

Par exemple, quelle est la vraie différence entre [Nstring Stringwithstring: (nstring *) astring] et [[NSString Alloc] Initwithstring: (Nstring *) astring] ?


0 commentaires

3 Réponses :


0
votes

sur votre exemple de xxx pré>

Lorsque vous effectuez un ALLOC, vous placez un espace pour la chaîne dans la mémoire d'où l'ALLOC. Vous le direz ensuite d'initialiser avec la chaîne égale à l'astring. Le (Nstring *) est un identifiant pour le type d'objet afin que vous disiez que l'astring est déclaré être un nstring. p>

Je fais habituellement quelque chose comme p> xxx pré>

déclare ce que l'astring est égal à. p>

Si vous allociez quelque chose dans la mémoire afin de Gérez cela, vous devrez le relâcher à la bonne heure, telle que la section P>

   -(void) dealloc {} 


1 commentaires

Cela va pour vous deux, des rues et de l'audacitor: vous n'avez pas besoin d'inclure le (nstring *) lors de l'envoi du initwithstring: message. Seule la déclaration de la méthode en a besoin (pour spécifier quel type la méthode attend). Lorsque vous l'inclurez dans le cadre d'un message, vous jetez la valeur astring sur nsstring * . Si astring est un nstring * , alors cela ne fait rien et n'est pas nécessaire; Si c'est autre chose, alors la distribution ne fera toujours rien d'utile: elle fera fermer le compilateur, mais vous vous plongerez au moment de l'exécution.



0
votes

La principale différence est que

    [[NSString alloc] initWithString: 
     (NSString*)aString]


2 commentaires

Eh bien, "Dont la gestion de la mémoire dont vous n'avez pas besoin de ne pas vous inquiéter" n'est pas tout à fait toute l'histoire et pourrait conduire un nouvel arrivé à égaré ... Par exemple, si vous attribuez le résultat à une variable d'instance (1), alors vous voulez Conservez le résultat d'une méthode de classe ou vous constaterez que lorsque vous accédez à votre système d'instance, il disparaîtra. Ceci est une erreur classique pour les nouveaux à Objc / Cocoa. (1) Une variable d'instance qui n'est pas une propriété avec un séchoir synthétisé est configurée pour conserver via les attributs de propriété.


Une autre erreur commune est la confusion des variables d'instance avec des propriétés. La stratégie de gestion de la mémoire (par exemple, retenir ) que vous déclarez pour une propriété n'a aucun effet sur la variable d'instance; Les affectations à la variable d'instance se produisent toujours sans effets secondaires, y compris aucune rétention ni des copies. Par conséquent, lorsque vous attribuez à un ivar, vous devez conserver ou copier la valeur vous-même. Seule l'affectation à une propriété peut le faire pour vous.



5
votes

La différence entre les méthodes est décrite dans Cocoa's Politique de propriété d'objet . Vous possédez l'objet renvoyé de -Initwithstring: vous devez donc le relâcher, mais vous ne possédez pas l'objet renvoyé de + Stringwithstring et que vous n'avez donc pas besoin de le relâcher (en outre, si vous souhaitez vous en tirer profiter, vous devez le retenir).

Les méthodes d'usine sont appelées parce qu'elles renvoient un objet déjà créé pour vous, généralement avec des paramètres que vous fournissez, servant à configurer l'objet, pour la commodité du programmeur.


0 commentaires