7
+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       [animation addObject:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(spriteSheet.CGImage, rect)] ]; 
      } 
     } 
    } 
} 

Compilé le code ci-dessus avec ARC activé. L'outil Analyser signale une fuite de mémoire possible car imageWithCGImage :: renvoie UIImage avec count +1, puis la référence est perdue. Fuites L'instrument ne signale aucune fuite de mémoire. Que se passe t-il ici?Fuite de mémoire avec ARC

De plus, étant donné que l'ARC interdit l'utilisation manuelle de release ect, comment réparer la fuite?

Merci à tous ceux qui peuvent offrir des conseils.

Répondre

8

ARC ne gère pas les types C, dont CGImage peut être pris en compte. Vous devez libérer l'arbitre manuellement lorsque vous avez terminé avec CGImageRelease(image);

+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       //store our image ref so we can release it later 
       //The create rule says that any C-interface method with "create" in it's name 
       //returns a +1 foundation object, which we must release manually. 
       CGImageRef image = CGImageCreateWithImageInRect(spriteSheet.CGImage, rect) 
       //Create a UIImage from our ref. It is now owned by UIImage, so we may discard it. 
       [animation addObject:[UIImage imageWithCGImage:image]]; 
       //Discard the ref. 
       CGImageRelease(image); 
      } 
     } 
    } 
} 
+2

Voir aussi la réponse acceptée à ma question ici: http://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-automatic-reference-counting-in-objective-c-not-prevent/6388601 # 6388601 – BoltClock

+0

"La règle de création indique que toute méthode d'interface C avec" create "dans son nom renvoie un objet de base +1, que nous devons libérer manuellement." - Doh! Bien sûr. Merci CodaFi! Apprécié! –

+0

@ Z.O. Aucun problème. La règle de création est en fait un peu difficile à trouver dans les docs, mais c'est très important quand on a affaire aux C-Interfaces d'Apple. [Ici c'est] (https://developer.apple.com/library/mac/documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029) (avec le obtenir la règle). – CodaFi

3

Aucune de la structure de données de base de base est traitée ARC. Beaucoup de fois cela crée un problème. Dans ce cas, nous devons libérer manuellement la mémoire.