2011-03-25 6 views
0
NSMutableArray *m_res = [NSMutableArray arrayWithCapacity:ticks]; 
double t = lo_t; 
while (t <= hi_t) { 
    [m_res addObject:[NSDecimalNumber decimalNumberWithDecimal: 
         [[NSNumber numberWithDouble:t] decimalValue] 
         ]]; 
    t += delta_t; 
} 

return [[NSArray arrayWithArray:m_res] retain]; 

Il est supposé retourner un NSArray persistant contenant certaines valeurs. Je prévois d'appeler la version quand elle n'est plus nécessaire. Est-ce correct ou il y a un bug, parce que quand j'appelle une fonction contenant ce code mon programme arrête de fonctionner (et c'est un problème de mémoire pas une boucle infinie).Est-ce que le morceau de code est sûr?

+0

Pouvez-vous nous donner une trace de pile, ou nous dire quelle erreur vous obtenez et sur quelle ligne? – GoatInTheMachine

Répondre

0

Le code est sûr (c'est-à-dire qu'il ne plantera pas) mais la dernière ligne est incorrecte. Le arrayWithArray ne fait rien d'utile et la retenue est une fuite.

Il devrait être

return m_res; 

Si vous Hava un accident, la cause est ailleurs.

+1

Encore une fois, un tableau renvoyé par 'arrayWithCapacity' sera déjà libéré, vous n'avez pas besoin de le libérer. Vous ne devriez pas non plus "conserver" le tableau dans cette méthode, car c'est la responsabilité de l'appelant de conserver/libérer comme nescessary; le faire dans cette méthode pourrait conduire à des fuites plus tard, car l'appelant peut ne pas réaliser qu'il doit «libérer» l'instance. L'exception serait s'il s'agissait d'une méthode 'init', ce qui ne semble pas être le cas. – GoatInTheMachine

+0

Hmm, vous avez raison, la retenue/autorelease est inutile, je l'ai enlevé, mais ce n'était pas une fuite et l'appelant n'aurait pas besoin de le libérer. – hooleyhoop

+0

Vous l'avez corrigé, mais l'original ** fuirait. Avec votre keep/autorelease unnescessary, le tableau aurait un nombre de retenue de 3 (l'autorelease initiale, votre conserver, et votre autorelease à la sortie augmenterait chacun le nombre de retenue). Lorsque le pool autorelease a été vidé, il serait autoreleased deux fois, mais cela ne ferait que ramener le nombre de retenue à 1, donc ce serait une fuite (à moins que l'appelant nouveau, il devait le libérer, auquel cas ce serait une mauvaise conception , l'objet qui retient est responsable de la libération, et vice versa). – GoatInTheMachine

Questions connexes