2010-06-22 4 views
0

J'ai lutté avec le meilleur modèle pour renvoyer un tableau d'une méthode statique.Retour d'un NSArray sans fuite?

Dans ma méthode statique getList (dans la classe BIUtility), j'alloue un NSArray à renvoyer. dans la ligne de retour, je fais:

return [array autorelease]; 

Puis, dans la méthode d'appel, je suis allouent un tableau comme celui-ci:

NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain]; 

Plus tard, je libérer la liste à l'aide:

[list release]; 

Je pense que cela provoque une fuite de mémoire car la retenue augmente le nombre de retenue de trop. Cependant, si je ne fais pas la retenue, j'obtiens un Bad_Exec parce qu'il a déjà libéré la classe. Je sens que je suis en train de trop réfléchir et qu'il doit y avoir un modèle typique. J'ai regardé partout et je ne peux pas trouver une «meilleure pratique».

J'apprécie votre aide.

Répondre

1

Vous devez remplacer:

NSArray * list = [[[NSArray alloc] initWithArray:[BIUtility getList]] retain]; 

Avec:

NSArray * list = [[BIUtility getList] retain]; 

En effet, getList retourne en fait un pointeur sur le NSArray. S'il s'agit d'un tableau mutable, vous devez cependant indiquer [[BIUtility getList] copy]; afin de ne pas muter accidentellement un tableau auquel un autre objet fait référence.

Si vous êtes curieux, vous avez eu une fuite de mémoire car votre instruction d'origine incrémente deux compteurs, alors que vous en libérez seulement un plus tard.

Ces parties des comptes d'augmentation de la déclaration:

[anObject]] retain] 
[anClassname alloc] 

[anObject copy] permettra également de créer un objet avec un compte de 1.

+0

Je l'ai fait, mais je reçois le message d'EXC_Bad_Instruction parce qu'il tente de faire la libération sur un objet qui a déjà été publié. N'ai-je pas besoin de faire une version explicite sur l'objet retenu? –

+0

@Michael: Comment déclarez-vous le tableau à l'origine? –

+0

Comme ceci ... NSArray * moveList = [[NSArray alloc] init]; Parfois, je dois utiliser un NSMutableArray car je le compile à partir d'une requête SQL, mais je renvoie un tableau NS. –