Je lisais la documentation de la pomme pour memory management, et j'ai rencontré quelque chose que je ne comprends pas. Fondamentalement, je ne comprends pas pourquoi on n'a pas besoin de conserver une variable d'instance à travers la méthode "getter". J'ai écrit ce petit programme pour voir ce qui se passerait. Je pensais qu'il y aurait un accident, mais il me manque évidemment quelque chose.Objectif C Confusion de la gestion de la mémoire
// main.m
// Test
//
#import <Foundation/Foundation.h>
#import "Test.h"
int main(int argc, char *argv[])
{
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];
//Initialize the test object
Test *t = [[Test alloc] init];
//Set the value to 5
[t setMyNum:[NSNumber numberWithInt:5]];
//Save a temp number that points to the original number
NSNumber *tempNum = [t myNum];
//release old number and retain new
[t setMyNum:[NSNumber numberWithInt:7]];
//Shouldn't this crash because tempNum is pointing to a deallocated NSNumber???
NSLog(@"the number is %@",tempNum);
[p drain];
return 0;
}
Est-ce que tempNum ne pointe pas vers un objet désalloué ??
Toute aide est appréciée.
EDITVoici le code dans les méthodes getter et setter
#import "Test.h"
@implementation Test
- (void)setMyNum:(NSNumber *)newNum {
[newNum retain];
[myNum release];
myNum = newNum;
}
-(NSNumber *)myNum {
return myNum;
}
@end
Comme vous pouvez le voir, je fais appel à la libération l'ancien objet.
EDITIl a été suggéré, et j'ai pensé à juste titre que la raison pour laquelle le tempNum est encore autour est parce qu'il n'avait pas encore été libéré de la piscine pour le moment. Mais même après avoir déplacé le [drain de la piscine] juste avant le message NSLog, il n'y a pas de crash ??? Bizarre.
Mais dans mon setMyNum, j'appelle explicitement «retain and release». Qu'arrive-t-il à l'ancien numéro après avoir appelé la libération? La libération – esiegel
ne libère pas l'objet, il en soustrait simplement un au "nombre de retain" de cet objet. c'est seulement quand le nombre de retenue frappe 0 que l'objet est désalloué. Dans votre cas, le nombre (NSNumber représentant 5) a un nombre de retenues de 1 immédiatement après sa création, puis est incrémenté à 2 lorsqu'il est défini dans votre objet Test, puis est réduit à 1 lorsqu'un autre numéro NSN (représentant 7) est obtenu défini dans l'objet Test. – harms
Je ne pense pas que ce soit totalement correct: J'ai essayé d'insérer un [p drain] avant que l'appel NSLog attend un crash, mais pas de crash ??? Il doit y avoir quelque chose d'autre qui retient la valeur? Encore confus – esiegel