retain-release et délégation?
tablier
Membre
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:
ç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:
ç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?
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 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 /> ...................<br /> retour = [sauvePanel runModalForDirectory:[filepath stringByDeletingLastPathComponent] file:lefichier];<br /> ...................<br /> 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 remplace ;<br />NSString *foutuNom ;<br />}<br />.......... déclaration des méthodes ici<br />end<br /><br />@implementation deleguer<br /><br />- (NSArray *)saveItem:(NSString ..................<br />{<br /> ...................<br /> retour = [sauvePanel runModalForDirectory:[filepath stringByDeletingLastPathComponent] file:lefichier];<br /> ...................<br /> 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?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il ne doit pas aimer beaucoup...
Tu peux vérifier toi même en faisant afficher dans chaque méthode :
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.
Faire un "retain" d'un côté et un "release" de l'autre...
: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
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)!
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)
- 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.