Je commence à regarder dans IOS Development et j'ai des doutes sur la libération d'objets pour lesquels je n'ai pas stocké de référence .. Je ai donné un coup d'oeil à la question "Libérer un objet sans aiguille?" où il est suggéré d'envoyer le message autorelease à l'objet immédiatement après sa création, et donc j'ai essayé de faire la même chose dans le morceau de code suivant:Erreurs autoéleasing objets juste après leur création
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSURLResponse * response = nil;
NSError * error = nil;
NSData * data;
data = [NSURLConnection
sendSynchronousRequest: [[NSURLRequest requestWithURL:
[[NSURL URLWithString: @"http://www.google.it"]
autorelease]
] autorelease]
returningResponse: &response
error: &error];
[data writeToFile: @"/tmp/test.html"
atomically:NO];
[data release];
[pool drain];
return 0;
}
Je ne pouvais pas essayer d'exécuter le programme dans XCode encore , mais je compile sous linux et le message autorelease envoyé à l'objet NSURLRequest provoque une erreur de segmentation (je pense qu'il n'est pas causé par le message lui-même mais par le drain de la piscine qui essaie de libérer l'objet, grâce au message autorelease) . Quel est le problème avec le message autorelease que j'ai envoyé à l'objet NSURLRequest? Je pense que si le document de référence pour une méthode de classe comme requestWithUrl dit qu'il "crée et retourne une requête d'URL" cela signifie que je suis responsable de libérer l'objet quand j'ai fini de l'utiliser, ai-je tort ? Je voudrais bien comprendre ces règles de gestion de la mémoire avant d'aller plus loin avec autre chose .. J'espère que mes questions ne sont pas trop stupides ;-)
Euh, juste une dernière question: devrais-je publier aussi l'erreur et les données Objets renvoyés par la requête synchrone?
Merci d'avance pour toute aide!
Je tiens à vous remercier tous pour les réponses immédiates! Je me doutais qu'ils étaient autoreleased, maintenant tout est beaucoup plus clair: si j'alloue quelque chose je dois le libérer (ou le marquer pour autorelease plus tard), si je crée une instance en utilisant une méthode de classe comme + requestWithUrl (qui ne contient pas init/copy/new words) Je ne devrais pas le publier sauf si je l'ai retenu pour une raison quelconque. –
@Gianni, exactement! :) – Vladimir