Cocoa WebView, plantage ?

Warflo

Membre expert
Club iGen
13 Août 2005
1 486
127
24
Marseille
Bonjour,
Je ne sais pas si il y en a ici qui bidouille un peu avec la WebView de Cocoa, mais je rencontre un problème étrange...
J'ai une classe toute simple Controller qui est l'UIDelegate de ma WebView. Le but est de garder en mémoire les deux derniers élements html survolés en implémentant webView:mouseDidMoveOverElement: modifierFlags: (old et current sont deux champs de classes de types DOMHTMLelement) :
Bloc de code:
- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(NSUInteger)modifierFlags {
	id temp = [elementInformation valueForKey:WebElementDOMNodeKey];
	if ([temp isKindOfClass:[DOMHTMLElement class]]) {
		old = current;
		current = (DOMHTMLElement *)temp;
                NSLog(@"%@, %@", old, current);
	}
}
Bon, le code est très simple, je recupère l'élement survolé, si il est de la bonne classe je le stocke dans current en le castant, et je stocke l'ancien current dans old.
Mais si je touche à un des objets (par exemple en le loggant) dès le premier survol, gdb se lance sans explication ...
Quelqu'un aurait une idée ?
 
Bonjour,
Je ne sais pas si il y en a ici qui bidouille un peu avec la WebView de Cocoa, mais je rencontre un problème étrange...
J'ai une classe toute simple Controller qui est l'UIDelegate de ma WebView. Le but est de garder en mémoire les deux derniers élements html survolés en implémentant webView:mouseDidMoveOverElement: modifierFlags: (old et current sont deux champs de classes de types DOMHTMLelement) :
Bloc de code:
- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(NSUInteger)modifierFlags {
    id temp = [elementInformation valueForKey:WebElementDOMNodeKey];
    if ([temp isKindOfClass:[DOMHTMLElement class]]) {
        old = current;
        current = (DOMHTMLElement *)temp;
                NSLog(@"%@, %@", old, current);
    }
}
Bon, le code est très simple, je recupère l'élement survolé, si il est de la bonne classe je le stocke dans current en le castant, et je stocke l'ancien current dans old.
Mais si je touche à un des objets (par exemple en le loggant) dès le premier survol, gdb se lance sans explication ...
Quelqu'un aurait une idée ?

a mon avis c'est NSLog qui crash
il faut que j'essaye la pas le temps, as tu essaye de tourner le prog hors de la session GDB
et attentre un crashlog parfois plus verbeux
 
Quand je le fais tourner sans gdb, il ne me dit rien d'autre que:
Bloc de code:
Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x00000000c0000023
Crashed Thread:  0
J'ai refais quelques test, ce n'est que quand je log ou quand j'envois un messge à "old" que ça plante.
 
id temp = [elementInformation valueForKey:WebElementDOMNodeKey];
Tu récupères un objet autorelease.

current = (DOMHTMLElement *)temp;
Et là tu viens stocker le pointeur de l'objet.

Une fois sorti de ta méthode, ton objet est releasé par le pool et ton pointeur 'current ' pointe vers une adresse qui n'est plus valide...

Essayes plutôt ça...
Bloc de code:
- (void)webView:(WebView *)sender mouseDidMoveOverElement:(NSDictionary *)elementInformation modifierFlags:(NSUInteger)modifierFlags {
	id temp = [elementInformation valueForKey:WebElementDOMNodeKey];
	if ([temp isKindOfClass:[DOMHTMLElement class]]) {
                // On se débarasse du dernier objet sotcké
                [current release];
                
                // On stock le nouvel objet en faisant un retain pour qu'il ne soit pas 
                // automatiquement purgé. 
		current = [(DOMHTMLElement *)temp retain];
	}
}
 
Merci beaucoup !
Ça marche niquel. :)