Plantage à  la fermeture d'un document sur Snow Leopard

mpergandmpergand Membre
mars 2013 modifié dans API AppKit #1
Bonjour à  tous,



Le problème semble venir de l'utilisation d'un KVO sur un élément de la ToolBar.

Le crash se produit à  partir de 10.6 et pas sur 10.5.



Les logs parlent d'un problème KVO à  la fermeture de la fenêtre:

- soit il me dit que le kvo n'a pas pu être enlevé car l'objet n'existe plus

- soit il me dit que je n'ai pas enlevé le kvo avant de fermer la fenêtre



Ma gestion de ce KVO est tout à  fait classique:



à  l'ouverture du document je fais:
<br />
[color=#898989]// KVO[/color]<br />
NSToolbarItem* addrItem=[bar itemWithIdentifier:Toolbar_AddressBar visibleOnly:[color=#0033f5]NO[/color]];<br />
[addrItem addObserver:[color=#0033f5]self[/color] forKeyPath:[color=#990006]@&quot;loading&quot;[/color] options:NSKeyValueObservingOptionNew context:[color=#0033f5]nil[/color]];<br />


et je l'enlève à  la fermeture dans dealloc.



La raison du crash est très simple: la fenêtre du document est déjà  désalouée !



La preuve, c'est que si je transfère le code du dealloc dans la méthode close du document, le crash ne se produit plus:
<br />
- ([color=#0033f5]void[/color])close<br />
{<br />
[color=#898989]// si fait dans dealloc, plantage alléatoire lors de la fermeture des fenêtres[/color]<br />
[color=#898989]// les fenêtres semblent être désalouées &#33;&#33;&#33;[/color]<br />
[color=#898989]// KVO[/color]<br />
NSToolbarItem* addrItem=[[[oWebView window] toolbar] itemWithIdentifier:Toolbar_AddressBar visibleOnly:[color=#0033f5]NO[/color]];<br />
[addrItem removeObserver:[color=#0033f5]self[/color] forKeyPath:[color=#990006]@&quot;loading&quot;[/color]];<br />
...<br />




Alors la question que l'on peut se poser: est-il normal/logique que la fenêtre d'un document soit déjà  désalouée à  l'exécution du dealloc ( et non dans super dealloc) ou bien les programmeurs de chez Apple font-ils n'importe quoi ?

Réponses

  • AliGatorAliGator Membre, Modérateur
    La propriété "dealloc on close" (enfin un truc comme ça je te dis ça de mémoire) est-elle à  YES ?

    Ca me parait bizarre aussi mais bon ça pourrait expliquer un minimum, même si ça reste pas clean de la par d'Apple qd mm, même si c'est ça
  • CéroceCéroce Membre, Modérateur
    Plusieurs fenêtres peuvent être associées à  un même document. Donc, la logique d'Apple est qu'un document ne correspond pas forcément à  une fenêtre. Et ton approche est mauvaise dans cette perspective, puisque tu lies la KVO au cycle de vie du document plutôt qu'à  celui de la fenêtre (voire de la toolbar).
  • 'Céroce' a écrit:
    tu lies la KVO au cycle de vie du document plutôt qu'à  celui de la fenêtre (voire de la toolbar).




    Ok, mais dans mon cas il y a une seule fenêtre par document.

    Et comment faire autrement, créer un WindowController spécialement pour ça ou intercepter la notification windowWillClose ?



    C'est un peu tordu quand même ...



    Mais surtout ce qui m'énerve, c'est que si ça marche avec 10.5, il n'y aucune raison pour que cela ne fonctione plus ensuite.

    Et ça Apple s'en fou.



    J'ai d'autres exemples d'applis qui fonctionnent très bien sur Tiger et Leopard et boum sur SL ça marche plus image/angry.gif' class='bbc_emoticon' alt='>:(' />
  • CéroceCéroce Membre, Modérateur
    Je te comprends, j'ai déjà  eu ce genre d'expériences, et je croise les doigts à  chaque nouvelle version de Mac OS X. Cela dit, en général, mon appli fonctionnait par chance sous les anciennes versions, et le problème était dû à  une mauvaise utilisation des API de ma part. Donc, je n'ai pas eu de problème de compatibilité descendante une fois le bug corrigé.




    'mpergand' a écrit:


    Et comment faire autrement, créer un WindowController spécialement pour ça ou intercepter la notification windowWillClose ?


    Il me semble que NSDocument maintient déjà  un NSWindowController pour charger le nib. Tu devrais donc pouvoir utiliser les méthodes -[NSDocument windowControllerDidLoadNib] et -[NSDocument shouldCloseWindowController...] dès à  présent.
  • Ou dans close comme je le fais.

    On peut aussi créer des WindowControllers spécifiques dans makeWindowControllers.



    La vérité, c'est qu'Apple est bien moins regardante sur la compatibilité rétroactive de ses OS que Microsoft, avec elle c'est un peu marche ou crève ...
Connectez-vous ou Inscrivez-vous pour répondre.