im assez nouveau à l'objectif-c, la plupart de c'est clair cependant quand il s'agit de la gestion de la mémoire, je tombe un peu court. Actuellement, ce que mon application fait est lors d'un NSURLConnection lorsque la méthode -(void)connectionDidFinishLoading:(NSURLConnection *)connection
est appelée Je saisis une méthode pour analyser certaines données, les placer dans un tableau et retourner ce tableau. Cependant je ne suis pas sûr si c'est la meilleure manière de faire puisque je ne libère pas le tableau de la mémoire dans la méthode personnalisée (méthode1, voir le code joint)tableau conserve la question
Voici un petit script pour mieux montrer ce que im faire
fichier .h
#import <UIKit/UIKit.h>
@interface memoryRetainTestViewController : UIViewController {
NSArray *mainArray;
}
@property (nonatomic, retain) NSArray *mainArray;
@end
fichier .m
#import "memoryRetainTestViewController.h"
@implementation memoryRetainTestViewController
@synthesize mainArray;
// this would be the parsing method
-(NSArray*)method1
{
// ???: by not release this, is that bad. Or does it get released with mainArray
NSArray *newArray = [[NSArray alloc] init];
newArray = [NSArray arrayWithObjects:@"apple",@"orange", @"grapes", "peach", nil];
return newArray;
}
// this method is actually
// -(void)connectionDidFinishLoading:(NSURLConnection *)connection
-(void)method2
{
mainArray = [self method1];
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
mainArray = nil;
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[mainArray release];
[super dealloc];
}
@end
par la façon si vous avez juste __ [[NSArray alloc] init] __ l'élément n'est pas retenu ni autoreleased. Donc, il ne sera pas fuite de mémoire, il sera juste sorti à un moment hors de la portée de la fonction. Alors que si vous utilisez __ [NSArray array withObjects: ..] __ il sera facilement autoeleased et vous n'aurez pas besoin de le libérer sur dealloc. – Jack
@Jack: C'est un non-sens, vous possédez les objets créés par '-alloc'. En outre, assigner des objets auto-libérés à ivars est mauvais, ils seront libérés quand le pool autorelease actuel est drainé, pas quand la durée de vie de votre objet se termine. Vous avez certainement des choses mélangées au sujet du comptage manuel et de la libération automatique, je vous recommande de lire le Guide de gestion de la mémoire. –