Ce code fonctionne:Comment suis-je en train de mal gérer la mémoire de mon iPhone?
monkey.h
@interface monkey : NSObject {
NSNumber *monkeyRanch;
}
@property (nonatomic, retain) NSNumber *monkeyRanch;
-(id) gatherTheMonkeys:(int)howmany;
monkey.m
@synthesize monkeyRanch;
-(id) gatherTheMonkeys:(int)howmany{
NSNumber *temp=[[NSNumber alloc] initWithInt:howmany];
monkeyRanch = temp;
[temp release];
return [monkeyRanch autorelease];
}
appDelegate.m
theMonkeys = [[monkey alloc] gatherTheMonkeys:3];
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
..et theMonkeys
sont libérés dans dealloc. Il n'y a pas de fuite dans Instrument. Mais, si je tente la même chose avec un tableau NSMutable
au lieu du NSNumber
:
monkey.h
@interface monkey : NSObject {
NSMutableArray *monkeyRanch;
}
@property (nonatomic, retain) NSMutableArray *monkeyRanch;
-(id) initTheMonkeys:(int)howmany;
monkey.m @synthesize monkeyRanch;
-(id) initTheMonkeys:(int)howmany{
monkeyRanch=[[NSMutableArray alloc] init];
NSNumber *imp =[[NSNumber alloc] initWithInteger:howmany];
[monkeyRanch addObject:imp];
[imp release];
return [monkeyRanch autorelease];
}
appDelegate
theMonkeys = [[monkey alloc] initTheMonkeys:3];
[theMonkeys retain];
cela provoque une fuite (d'un objet 'singe'), juste au début de l'application.
J'ai essayé de changer le initTheMonkeys
à ce qui suit:
NSMutableArray *temp=[[NSMutableArray alloc] init];
monkeyRanch=temp;
[temp release];
NSNumber *imp =[[NSNumber alloc] initWithInteger:howmany];
[monkeyRanch addObject:imp];
[imp release];
return [monkeyRanch autorelease];
mais le nombre de conserver monkeyRanch
obtenu à zéro que la libération temporaire et l'application s'écrase joyeusement.
Qu'est-ce que je fais de mal, et comment puis-je le réparer?
Que diable est un monkeyRanch? Était-ce censé être "monkeyWrench"? :) –