2010-04-26 4 views
2

Je l'ai vu dans l'exemple de code (Apple) deux types de moyens de mémoire d'allocation, et ne suis pas sûr que je comprends la différence et le comportement résultant.iPhone gestion de la mémoire, une question de débutant

// FAILS 
NSMutableArray *anArray = [NSMutableArray array]; 
[anArray release]; 

// WORKS 
NSMutableArray *anArray1 = [[NSMutableArray alloc] init]; 
[anArray release]; 

Par « ECHOUE » Je veux dire que je reçois des accidents/avertissements d'exécution, etc., et pas toujours dès que j'appelle la libération ...

Toute explication appréciée.

Merci

+0

un double possible de http://stackoverflow.com/questions/1740286/suggest-the-best-way-of-initialization-of-array-or-other- Objets –

+0

En règle générale, vous devriez seulement '[release]' objets que vous ['alloc]' ou '[conserver]' –

Répondre

6

S'il vous plaît garder à l'esprit que

NSMutableArray *anArray = [NSMutableArray array]; 

agit comme:

NSMutableArray *anArray1 = [[[NSMutableArray alloc] init] autorelease]; 

fait donc une version à nouveau provoquera l'accident que vous essayez de libérer un objet autoreleased.

J'espère que cela vous aide.

Merci,

Madhup

2

En premier lieu, vous obtenez un objet autoreleased, que vous n'avez pas besoin de libérer

Le deuxième cas est celui où vous allouez manuellement vous-même, vous la mémoire d'un responsable de la le relâcher.

cette documentation de l'aide: -

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

+0

Juste poster pour dire que vous * absolument * besoin de lire le guide de gestion de la mémoire Objective-C d'Apple. Bien que ce lien soit légèrement incorrect; le lien réel est http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html. Il n'y a pas d'excuse pour programmer en Objective-C sans lire ce guide. – dancavallaro

+0

Oups, a corrigé le lien. Merci – djhworld

1

Pour clarifier la réponse de djhworlds:

alloc, copy, mutableCopy et new vous rendre le propriétaire du nouvel objet, retain vous fait un propriétaire d'un objet existant, et vous devenez responsable de -[(auto)release]. D'autres méthodes renvoient un objet qui a été -[autoreleased], et donc vous n'avez aucune responsabilité pour cela, mais attention: Il disparaîtra lors de la prochaine itération de la boucle d'exécution (habituellement), car est généralement lorsque le pool autorelease drains. Le résultat pratique est que la version // FAILS fonctionne parfaitement dans le contexte de ce morceau particulier de code, mais une fois que la boucle d'exécution tourne et que le pool est drainé, votre objet, étant déjà libéré et parti, fait bouger les choses.

+0

Ne pas oublier conserver. –

+0

'- [retenir]'! N'oublie jamais! –

Questions connexes