Pb tutorial PO n?11 : autorelease
muqaddar
Administrateur
Salut,
J'ai fait le tutorial 11 avec la sauvegarde dans les préférences ou dans un fichier.
L'appli marche impecable.
J'ai noté dans le code de mike beam téléchargé un "[record autorelease];" que je n'ai pas dans la méthode - (NSDictionary *)createRecord . Si je l'ajoute comme lui, l'appli plante, avec une erreur de malloc, donc de mémoire... Pourtant, son appli fonctionne avec cet autorelease en plus... et je me prends un sigbus : AddressBook has exited due to signal 10 (SIGBUS).
bizarre.
Un morceau du code :
//dictionnaire des donnees
- (NSDictionary *)createRecord
{
NSMutableDictionary *record = [NSMutableDictionary dictionary];
[record setObject:[firstNameField stringValue] forKey:@First Name];
[record setObject:[lastNameField stringValue] forKey:@Last Name];
[record setObject:[emailField stringValue] forKey:@Email];
[record setObject:[homePhoneField stringValue] forKey:@Home Phone];
[firstNameField setStringValue:@""];
[lastNameField setStringValue:@""];
[emailField setStringValue:@""];
[homePhoneField setStringValue:@""];
[record autorelease];
return record;
}
J'ai fait le tutorial 11 avec la sauvegarde dans les préférences ou dans un fichier.
L'appli marche impecable.
J'ai noté dans le code de mike beam téléchargé un "[record autorelease];" que je n'ai pas dans la méthode - (NSDictionary *)createRecord . Si je l'ajoute comme lui, l'appli plante, avec une erreur de malloc, donc de mémoire... Pourtant, son appli fonctionne avec cet autorelease en plus... et je me prends un sigbus : AddressBook has exited due to signal 10 (SIGBUS).
bizarre.
Un morceau du code :
//dictionnaire des donnees
- (NSDictionary *)createRecord
{
NSMutableDictionary *record = [NSMutableDictionary dictionary];
[record setObject:[firstNameField stringValue] forKey:@First Name];
[record setObject:[lastNameField stringValue] forKey:@Last Name];
[record setObject:[emailField stringValue] forKey:@Email];
[record setObject:[homePhoneField stringValue] forKey:@Home Phone];
[firstNameField setStringValue:@""];
[lastNameField setStringValue:@""];
[emailField setStringValue:@""];
[homePhoneField setStringValue:@""];
[record autorelease];
return record;
}
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Dans -(NSDictionary *)createRecord ,
la logique voudrait que tu crées un dictionnaire record par :
NSMutableDictionary *record = [[NSMutableDictionary alloc] init];
puis que tu t'en débarrasses par :
[record autorelease]
(autorelease et non pas release, à cause du "return record" juste après).
Mais Cocoa, dans sa grande mansuétude, a voulu te simplifier la t‚che :
Pourquoi s'embêter à gérer l'initialisation, la place en mémoire, la suppression de tous les objets que l'on va utiliser ? Alors que ce pourrait être automatique !
Et bien Cocoa a eu une idée lumineuse : les objets temporaires, gérés par les méthodes elels-mêmes :
Au lieu de [[NSMutableDictionary alloc] init], on écrit [NSMutableDictionary dictionary] (on demande à la classe NSMutableDictionary de se débrouiller pour nous créer un dictionnaire fonctionnel, avec initialisation et gestion de la mémoire, à l'aide de la méthode de classe +dictionary)
Une fois que tu sors de la méthode -(NSMutableDictionary *)createRecord par return record, un autorelease est automatiquement expédié à ton record.
Ouah, le pied, plus besoin de s'embêter avec les init, les alloc, les (auto)release !
Pourquoi alors en trouve-t-on encore dans les -(id)init et les (void)dealloc de certaines classes ? Parce que ici ce ne sont pas des objets temporaires que l'on traite, mais des variables d'instances, que l'on pourra utiliser dans toutes les méthodes de la classe.
Les objets "temporaires" existent (entre autres ?) dans les classes NSString, NSDictionary, NSArray. autrement dit des classes que l'on utilise très souvent dans le code. J'écris "temporaire" entre guillemets, car l'objet n'est pas supprimé après return record, seulement on s'en est débarrassé, c'est un autre objet qui s'en occupe dorénavant.
Finalement, pour répondre à ta question :
tu as écrit record = [NSMutable dictionary]
puis [record autorelease].
D'où 2 autorelease : le tien, et l'automatique. C'est trop pour un seul objet !
Je crois que j'ai à peu près compris les notions d'objets "temporaires" et les autres...
[Fichier joint supprimé par l'administrateur]
soit tu écris -(NSMutableDictionary *)tableColumns; et alors tu déclares une méthode.
C'est toi qui vois !
Je me commanderais bien la FreeBox mais j'ai peur de me faire avoir car je n'y connais rien.
Gr‚ce à toi, je revois tous mes anciens tutoriels. Ils me paraissent évidents maintenant !
N'hésites pas à poser des questions dans le forum "coin canapé" là-dessus, ou sur d'autres sites comme MacADSL.