2009-11-19 4 views
0

J'essaie d'apprendre Objective-C. J'ai presque fini un excercise mais il ne désaffecter la mémoire:Le code Objective-C ne libère pas la mémoire!

Voici ce que j'ai:

void PrintPolygonInfo() { 
    NSLog(@"--------------------"); 
    NSLog(@" PRINT POLYGON INFO"); 
    NSLog(@"--------------------"); 
    NSMutableArray *array = [[NSMutableArray alloc] init]; 
    PolygonShape *p1 = [[PolygonShape alloc] initWithNumberOfSides:4 minimumNumberOfSides:3 maximumNumberOfSides:7]; 
    PolygonShape *p2 = [[PolygonShape alloc] initWithNumberOfSides:6 minimumNumberOfSides:5 maximumNumberOfSides:9]; 
    PolygonShape *p3 = [[PolygonShape alloc] initWithNumberOfSides:12 minimumNumberOfSides:9 maximumNumberOfSides:12]; 
    [array addObject:p1]; 
    [array addObject:p2]; 
    [array addObject:p3]; 
    // Log the descriptions 
    for (id shape in array) { 
     NSLog(@"%@", shape); 
    } 
    // Test the constraints 
    for (PolygonShape *shape in array) { 
     [shape setNumberOfSides:10]; 
    } 
    [p1 release]; 
    [p2 release]; 
    [p3 release]; 
} 

C'est le dealloc():

- (void) dealloc { 
    NSLog(@"Deallocated!!!"); 
    [super dealloc]; 
} 

Et ce sont les résultats :

2009-11-19 06:58:17.030 Assignment 1B[5441:a0f] -------------------- 
2009-11-19 06:58:17.030 Assignment 1B[5441:a0f] PRINT POLYGON INFO 
2009-11-19 06:58:17.031 Assignment 1B[5441:a0f] -------------------- 
2009-11-19 06:58:17.031 Assignment 1B[5441:a0f] init: Retain count of 1. 
2009-11-19 06:58:17.032 Assignment 1B[5441:a0f] init: Retain count of 1. 
2009-11-19 06:58:17.032 Assignment 1B[5441:a0f] init: Retain count of 1. 
2009-11-19 06:58:17.033 Assignment 1B[5441:a0f] Hello I am a 4-sided polygon (aka a Square) with angles of 90 degrees (1.570796 radians). 
2009-11-19 06:58:17.033 Assignment 1B[5441:a0f] Hello I am a 6-sided polygon (aka a Hexagon) with angles of 120 degrees (2.094395 radians). 
2009-11-19 06:58:17.034 Assignment 1B[5441:a0f] Hello I am a 12-sided polygon (aka a Dodecagon) with angles of 150 degrees (2.617994 radians). 
2009-11-19 06:58:17.034 Assignment 1B[5441:a0f] Invalid number of sides: 10 is greater than the maximum of 7 allowed 
2009-11-19 06:58:17.035 Assignment 1B[5441:a0f] Invalid number of sides: 10 is greater than the maximum of 9 allowed 

Comme vous pouvez le voir, il n'imprime pas le message « dEALLOCATED !!! »:

Quelqu'un peut-il me dire ce que je fais mal s'il vous plaît?

Merci d'avance

Répondre

7

Le tableau conserve les objets qu'il contient. Les objets peuvent uniquement être désallocalisés une fois qu'ils sont supprimés du tableau, ou le tableau est libéré.

+0

Merci! Ça fonctionne maintenant! –

2

Votre tableau vous échappe. Vous le créez avec alloc/init, mais jamais le libérer. Soit release, soit créez-le avec [NSMutableArray array].

De plus, la méthode dealloc est appelée sur les objets lorsqu'ils sont libérés. Cependant, il semble que vous utilisiez une fonction (pas une méthode d'un objet) pour faire cela. Comment est configuré le reste de votre code?

1

Notez que si vous êtes une application se termine, la méthode dealloc peut ne pas être appelée. La mémoire de l'application est effacée de toute façon et OSX pourrait décider qu'il est plus rapide de simplement terminer l'application et effacer la mémoire sans passer par tous les deallocs. Ce document est documenté dans le document NSObject reference.

Questions connexes