Question

Je définis un nombre, comme suit:

NSNumber *nn0 = [NSNumber numberWithInt:0];

Cela fonctionne très bien sans allocation. D'après ce que j'ai compris, si j'utilise numberWithInt, alloc et init sont appelées automatiquement.

Si j'essaie de libérer à la fin de ma fonction, je rencontre des problèmes:

[nn0 release];

Je reçois une erreur d'exécution.

Ma question est la suivante: si j'utilise numberWithInt pour initialiser le NSNumber, dois-je gérer la mémoire dessus?

Était-ce utile?

La solution

Les "constructeurs de commodité" & pour un grand nombre de types, produit un objet automatiquement "auto-libéré". - c’est-à-dire que le nouvel objet sera conservé par le NSAutoreleasePool actuel. Vous n'avez pas besoin de libérer manuellement ces objets - ils seront publiés lorsque le NSAutoreleasePool actuel sera libéré / vidé.

Voir cette page pour une description des constructeurs de commodité et comment gérer la mémoire pour ces derniers.

http: // www. macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

Autres conseils

Suivez simplement la règle de gestion de la mémoire principale: si vous "possédez". la variable, vous devez éventuellement abandonner la propriété. Vous en prenez possession en: créant l'objet (alloc / new / copy) ou spécifiquement en prenant possession (à conserver). Dans tous ces cas, vous devez le publier.

Si vous souhaitez que l’objet reste en place, vous devez vous en approprier la propriété. Donc, si vous savez que vous n’avez besoin que du nombre pour cette méthode (par exemple, pour le transférer dans un tableau), utilisez la méthode de commodité et laissez-la simplement. Si vous souhaitez conserver le numéro pour une raison quelconque (et une variable d'instance, par exemple), vous pouvez alors l'allouer / l'initialiser en toute sécurité.

Si vous publiez quelque chose que vous ne possédez pas, vous obtiendrez une erreur d'exécution.

La règle est simple, à de très rares exceptions près:

  

Si le sélecteur renvoyant un objet contient le mot "nouveau", "allouer", "conserver". ou " copier " dans celui-ci, vous êtes le propriétaire de l’objet retourné et vous êtes responsable de sa publication lorsque vous avez terminé.

Sinon, vous ne le possédez pas et vous ne devez pas le publier. Si vous souhaitez conserver une référence à un objet n'appartenant pas à la propriété, vous devez appeler - [NSObject conserver] sur cette instance. Vous avez maintenant " propre " Cette instance doit donc appeler - [NSObject release] sur l’instance lorsque vous avez terminé. Ainsi, vous ne possédez pas l'instance renvoyée par - [NSNumber numberWithInt:] et vous ne devez pas appeler -release dessus lorsque vous avez terminé. Si vous souhaitez conserver l'instance renvoyée au-delà de la portée actuelle (bien au-delà de la durée de vie de l'instance NSAutoreleasePool actuelle), vous devez la -retain .

En termes normaux, Peter Hosey le dit très bien dans son blog . Vous possédez l'instance d'objet renvoyée si le sélecteur de méthode correspond à cette expression rationnelle:

/^retain$|^(alloc|new)|[cC]opy/

Bien entendu, la référence définitive est le Guide de programmation de la gestion de la mémoire pour Cacao .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top