Pb tutorial PO n?11 : autorelease

muqaddarmuqaddar Administrateur
12:52 modifié dans API AppKit #1
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;
}

Réponses

  • TiffTiff Membre
    12:52 modifié #2
    Tu n'as pas bien regardé le tutoriel. Je l'ai sous les yeux :

    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 !
  • muqaddarmuqaddar Administrateur
    12:52 modifié #3
    Merci pour cette explication Tiff.
    Je crois que j'ai à peu près compris les notions d'objets "temporaires" et les autres...
  • muqaddarmuqaddar Administrateur
    12:52 modifié #4
    J'ai une erreur impossible à supprimer dans le code ci-dessous, la ligne surlignée... je l'ai relu plein de fois, je ne vois pas pourquoi j'ai une parse error...

    [Fichier joint supprimé par l'administrateur]
  • TiffTiff Membre
    12:52 modifié #5
    Soit tu écris NSMutableDictionary *tableColumns; et dans ce cas tu déclares une variable
    soit tu écris -(NSMutableDictionary *)tableColumns; et alors tu déclares une méthode.
    C'est toi qui vois !
  • muqaddarmuqaddar Administrateur
    12:52 modifié #6
    Ah merci, je suis un gros boulet, je compte pas les automatismes que je n'ai pas encore !
  • TiffTiff Membre
    12:52 modifié #7
    Oui, ben moi, c'est Internet que je ne maà“trise pas du tout.
    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 !
  • muqaddarmuqaddar Administrateur
    12:52 modifié #8
    Je vais passer chez free ADSL prochainement.
    N'hésites pas à poser des questions dans le forum "coin canapé" là-dessus, ou sur d'autres sites comme MacADSL.
  • 12:52 modifié #9
    Si cet aspect de la gestion de la mémoire, PO a publié un article là dessus: http://www.projectomega.org/article.php?lg=fr&php=tuts_objc2&p=1
Connectez-vous ou Inscrivez-vous pour répondre.