2010-04-02 3 views
-1

J'ai une méthode qui fonctionne ceci:gestion de la mémoire Objective-c

Track* track = [[Track alloc] init:[obj objectForKey:@"PersistentID"] :[obj objectForKey:@"Name"] :[obj objectForKey:@"Artist"] :(NSInteger*)[obj objectForKey:@"Total Time"] :(NSInteger*)[obj objectForKey:@"Play Count"]]; 

[auto setCurrentTrack: (Track *) piste]; [libération de la voie];

Dois-je libérer une trace?

+4

Nommer une méthode dans Objective-C '-init :::::' est considéré comme une mauvaise pratique. Vous voudrez peut-être lire les conventions de dénomination d'Apple dans le centre de développement. En outre, vous ne pouvez pas stocker un NSInteger dans un NSDictionary: seulement un NSNumber, qui est une classe wrapper. Casting est juste un moyen sûr de planter votre programme. –

Répondre

2

Oui. Vous êtes responsable de la libération d'un objet à chaque fois que vous possédez l'objet. Vous possédez un objet à chaque fois que vous lui envoyez un message alloc, new, copy ou retain. Votre propriété currentTrack doit conserver la piste.

0

Eh bien, vous n'avez pas à, mais si vous n'avez plus besoin de l'utiliser alors vous devriez. aussi il n'est pas nécessaire d'avoir ": (Track *) track];" Personnellement, je préfère

[self setCurrentTrack:track]; 

parce que c'est une pratique plus courante.

+1

Pourquoi est-ce un bug d'avoir le typecast? Ce n'est pas nécessaire, mais ce n'est pas une erreur non plus. –

+0

Eh bien, il est plus commun d'avoir ce que je montre ci-dessus –