retain-release et délégation?

tabliertablier Membre
22:51 modifié dans API AppKit #1
l'exposé est un peu long, mais je souhaite être clair.

j'ai créer "deleguer" qui contient la méthode "saveitem"  et une méthode déléguée de "runModalForDirectory" dans le but de faire disparaà®tre l'alerte "le fichier xxxx existe déjà ,voulez-vous le remplacer. Extrait du code:

@interface deleguer : NSObject<br />{<br />BOOL&nbsp; &nbsp; remplace ;<br />char	foutuNom[128] ;<br />}<br />.......... déclaration des méthodes ici<br />end<br /><br />@implementation deleguer<br /><br />- (NSArray *)saveItem:(NSString ..................<br />{<br />&nbsp; &nbsp; ...................<br />&nbsp; &nbsp; retour = [sauvePanel runModalForDirectory:[filepath stringByDeletingLastPathComponent] file:lefichier];<br />&nbsp; &nbsp; ...................<br />&nbsp; &nbsp; return [NSArray arrayWithObjects: [NSString stringWithUTF8String:(const char *)foutuNom], ..............<br />}<br /><br />- (NSString *)panel:(id)sender userEnteredFilename:(NSString *)filename confirmed:(BOOL)okFlag<br />{<br />	strcpy(foutuNom, [filename UTF8String]) ;<br />	if (remplace)<br />		return quedalle ;<br />	return filename ;<br />}<br />

ça marche! mais suivant un proverbe italien: "la traduction c'est la trahison" j'ai donc voulu me passer de [filename UTF8String] et j'ai modifier l'ensemble comme ci dessous:

@interface deleguer : NSObject<br />{<br />BOOL&nbsp; &nbsp; &nbsp; remplace ;<br />NSString&nbsp; *foutuNom ;<br />}<br />.......... déclaration des méthodes ici<br />end<br /><br />@implementation deleguer<br /><br />- (NSArray *)saveItem:(NSString ..................<br />{<br />&nbsp; &nbsp; ...................<br />&nbsp; &nbsp; retour = [sauvePanel runModalForDirectory:[filepath stringByDeletingLastPathComponent] file:lefichier];<br />&nbsp; &nbsp; ...................<br />&nbsp; &nbsp; return [NSArray arrayWithObjects: [NSString stringWithUTF8String:(const char *)foutuNom], ..............<br />}<br /><br />- (NSString *)panel:(id)sender userEnteredFilename:(NSString *)filename confirmed:(BOOL)okFlag<br />{<br />	foutuNom = [NSString stringWithString:filename] ;<br />	if (remplace)<br />		return quedalle ;<br />	return filename ;<br />}<br />

ça ne marche pas! dans la méthode "panel:", "foutuNom" pointe bien sur le nom du fichier sélectionné, mais dans "saveItem:", après l'appel à  runModalForDirectory, "foutuNom" ne pointe sur rien de censé!
je suppose que c'est un problème de retain-release automatique et j'en arrive aux questions:

- l'exécution de la methode déléguée "panel:" se fait-elle dans le même thread que l'exécution de "saveItem" ?
- quand sont desalouées les variables autoreleased? quand elles sont inutiles, oui mais encore?
- pour repasser l'information filename par un NSString * comment dois-je m'y prendre?

Réponses

  • schlumschlum Membre
    22:51 modifié #2
    Dans ton second code tu caste un NSString* en const char*

    Il ne doit pas aimer beaucoup...
  • tabliertablier Membre
    22:51 modifié #3
    Désolé, j'ai fait une erreur de "couper-coller". sur le 2ième cas, le retour de la méthode "saveItem:" se fait par:
    &nbsp; &nbsp; return [NSArray arrayWithObjects:foutuNom, ............etc
    


  • schlumschlum Membre
    22:51 modifié #4
    dans 1184660723:


    - l'exécution de la methode déléguée "panel:" se fait-elle dans le même thread que l'exécution de "saveItem" ?


    Tu peux vérifier toi même en faisant afficher dans chaque méthode :

    NSLog(@&quot;%x&quot;,[NSThread currentThread]);
    


    - quand sont desalouées les variables autoreleased? quand elles sont inutiles, oui mais encore?


    Non, pas quand elles sont inutiles, sinon ça serait un Garbage Collector... Un "release" (et pas "dealloc" !) est envoyé à  chaque début (ou fin ?) de cycle de la runLoop aux objets dans le NSAutoreleasePool.

    - pour repasser l'information filename par un NSString * comment dois-je m'y prendre?


    Faire un "retain" d'un côté et un "release" de l'autre...
  • tabliertablier Membre
    22:51 modifié #5
    J'avais essayé les "retain-release", mais comme ça plantait ferme, je les avais supprimé!
    :P  Suite à  ta réponse j'ai re-essayé et ça marche!!  Merci, trois jours d'erreurs corrigées en 10 mn!!

    pour le Garbage collector
    -
    quand sont desalouées les variables autoreleased? quand elles sont inutiles, oui mais encore?


    Non, pas quand elles sont inutiles, sinon ça serait un Garbage Collector... Un "release" (et pas "dealloc" !) est envoyé à  chaque début (ou fin ?) de cycle de la runLoop aux objets dans le NSAutoreleasePool.

    Contrairement a ce que l'on peut comprendre dans ta réponse, le Garbage collector ne désaloue pas les variables inutilisées, mais regroupe les zones de mémoire libre en un seul bloc de mémoire (du moins si mes souvenirs de Mac OS 4 à  Mac OS 9.2.2 sont corrects). Les zones utilisées se retrouvent également groupées (forcément)!


  • AliGatorAliGator Membre, Modérateur
    juillet 2007 modifié #6
    Ah je suis pas tot à  fait d'accord (ça ça ressemblerait plutôt à  une défragmentation de la RAM), pour moi le GC, comme en java, permet justement de supprimer automatiquement les objet qui ne sont plus utilisés, ou du moins de marquer cet espace de la mémoire comme disponible pour d'autres allocations.
    Ce qui fait que du coup tu n'as plus à  te soucier de les supprimer ou non (ce qui a ces avantages et ces inconvénients, y compris au niveau des habitudes de prog, mais c'est un autre débat).
    C'est en tout cas son but premier, son objectif, ce qu'il fait par définition.

    Alors après, cela n'empêche pas un algo de défragmentation de la mémoire qui tournerait en plus, mettant alors de côté les zones mémoire "réallouables" (autrement dit la mémoire libre) et en groupant la mémoire encore utilisée. Mais ça ça dépend de l'implémentation du GC (selon si l'algo utilisé par le GC est "moving" ou "non-moving", groupant ainsi les zones mémoires vides (ou pas).

    [EDIT] : GC's Implementation Strategies (wikipedia)
  • tabliertablier Membre
    22:51 modifié #7
      J'ai jeté un oe“il sur l'article en référence. Effectivement, considéré comme une méthode de gestion de la mémoire d'un langage particulier, le GC peut désalouer des variables inutilisées. J'ai quelques excuses pour ce que j'ai écrit:
    - je ne suis qu'un amateur (même pas informaticien)!
    - je programme des Macs depuis longtemps et le seul GC que je connaisse est le Garbage collection (et non pas collector) des anciens Mac OS: grosso modo une défragmentation du heap mémoire de l'application avec déplacement des zones utilisées.
Connectez-vous ou Inscrivez-vous pour répondre.