2012-01-25 4 views
3

Dans une classe Utilitaires, j'ai la méthode suivante:iOS: fuite de mémoire

+ (Division *) getNationalDivision 
{ 
    Division *defaultDivision = [[[Division alloc] init] autorelease]; 
    defaultDivision.Id = 0; 
    defaultDivision.name = @"National"; 

    return defaultDivision; 
} 

J'ai une division allocted dans mon délégué app pour stocker la division à travers l'application, donc dans un de mes contrôleurs de vue I ont:

appDel.currentDivision = [[Utilities getNationalDivision] retain]; 

Dans le délégué de l'application .h je:

@property (nonatomic, retain) Division *currentDivision; 

Dans le délégué app .m J'ai:Lorsque j'analyse, j'obtiens une fuite potentielle d'un objet qui pointe vers la ligne ci-dessus. Des idées? Si je ne retiens pas la division nationale, ça ne marche pas. Aussi, juste pour noter, tout fonctionne bien. Je veux juste m'assurer que je ne fuis pas quelque chose.

+1

Comment avez-vous déclaré currentDivision? – blueberryfields

+0

Vous pouvez indiquer quelle est la propriété 'currentDivision' définie. Je présume «retenir»? Dans ce cas, le «retenir» supplémentaire est très probablement une sur-retenue. Nous en saurons plus avec la définition '@ property'. –

+0

J'ai ajouté le code, je l'attribue – Jesse

Répondre

1

Vérifiez comment vous déclarez la propriété currentDivision dans le délégué de votre application. S'il est assign (que je suppose, puisque vous retenir avant d'attribuer par la propriété), la valeur d'origine vous lui avez assigné:

currentDivision = [[Division alloc] init]; 

ne se released lorsque vous exécutez:

appDel.currentDivision = [[Utilities getNationalDivision] retain]; 

par conséquent, l'objet que vous avez créé dans le délégué de l'application fuira. Faites une version manuellement et vérifier si l'analyseur garde se plaindre:

[app.currentDivision release]; 

Cela n'a de sens que dans le cas où votre propriété est déclarée comme assign.

Dans le cas où il est déclaré comme retain, la faute est en ligne:

appDel.currentDivision = [[Utilities getNationalDivision] retain]; 

où vous ne devriez pas faire Retain manuellement.

2

La conservation est effectuée par la méthode de l'accesseur de propriété synthétisée. Retirez-le.

+1

+1. Mais combien de fois faut-il continuer à le dire? – Abizern

+0

Il dit que cela ne fonctionne pas s'il enlève conserver. Donc, il n'est probablement pas conservé comme une propriété ... @Jesse: s'il vous plaît fournir plus d'informations sur la façon dont vous définissez la propriété currentDivision (ou est-ce une variable locale ...) –

+0

Plus d'infos ajoutées. – Jesse