Ah KVO et ICAApplication

laudemalaudema Membre
03:52 modifié dans API AppKit #1
Les KeyValueObserving c'est bien, quand c'est soi qu'on les dirige, quand c'est pas soi c'est pas pareil..
Mon but est de pouvoir utiliser mon scan "ala" preview (Aperçu). Pour ça Apple a prévu l'application Transfert d'Image (Image Capture Application : ICA). Pour aider les developers il y a un fichier à  télécharger avec des tas d'exemples et dedans un tout petit qui s'appelle ICAImportImageSample_Cocoa. une quinzaine de lignes de code pour emballer une fonction "Carbon" error = ICAImportImage(&thePB, NULL);
A part qu'on ne peut pas changer les paramètres et qu'on a pas Transfert d'Image en français. Mais jusque là  ça marche (après avoir fini par comprendre suffisamment les fonctions C).

Sauf que quand tout est fini ma console est envahie de messages kvo et ça fait sale :
(gdb) continue
2009-04-07 15:28:00.952 ICAImportImageSample_Cocoa[2557:813] An instance 0x1c66d0 of class ICScanHelper is being deallocated while key value observers are still registered with it. Observation info is being leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x15f2dc60> (
<NSKeyValueObservance 0x15f12770: Observer: 0x15f11d70, Key path: scanInProgress, Options: <New: NO, Old: NO, Prior: NO> Context: 0x1cae50, Property: 0x15f12750>
<NSKeyValueObservance 0x15f0d420: Observer: 0x14d140, Key path: didCancelScan, Options: <New: NO, Old: NO, Prior: NO> Context: 0x1cae50, Property: 0x15f12ab0>


La suite sur 40 lignes ....
D'un naturel obeissant et curieux j'ai donc mis le breakpoint :

2009-04-07 16:07:45.359 ICAImportImageSample_Cocoa[2829:813] An instance 0x1c6890 of class ICScanner is being deallocated while key value observers are still registered with it. Observation info is being leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:
<NSKeyValueObservationInfo 0x15f20860> (
<NSKeyValueObservance 0x15f143a0: Observer: 0x15f21d50, Key path: notificationString, Options: <New: NO, Old: NO, Prior: NO> Context: 0x1cf900, Property: 0x15f14580>
)

Ensuite j'ai cherché qui était l'obersveur qui s'était sauvé :
(gdb) po 0x15f21d50
<NSKeyValueObservance 0x15f21d50: Observer: 0x15f21820, Key path: icScanner.notificationString, Options: <New: NO, Old: NO, Prior: NO> Context: 0x0, Property: 0x15f21cc0>

Suivant:
(gdb) po 0x15f21820
<NSTextValueBinder: 0x15f21820>{object: <NSTextField: 0x1ef9f0>, bindings: value=icScanner.notificationString}

Un text field:
(gdb) po 0x1ef9f0
<NSTextField: 0x1ef9f0>

Mais après je sais plus quoi faire parce qu'il n'y en a pas de textfield dans le nib (c'est le cas de le dire :-)
Dans le nib il y a une window et dans la window un button qui lance la IBAction et puis c'est tout ...

Voilà , après avoir bien cherché (et appris plein de choses) je me sens coincé. J'ai essayé de remonter la hierarchie de la textView (NSCell, NSObject) pour trouver une méthode d'instance qui m'en dirait plus sur elle et je n'ai trouvé que toManyRelationshipKeys
(gdb) po [0x1ef9f0 toManyRelationshipKeys]
Cannot access memory at address 0x0
Donc elle n'existe pas, d'où la complainte (si j'ai bien compris).

Il y a peut être un moyen de trouver plus mais j'en doute et pour aujourd'hui je n'ai plus le temps de chercher dans la doc alors si quelqu'un avait une idée je serais ravi d'essayer. Pour l'instant je laisse tomber, peut être que j'essayerais automator ou AppleScript mais là  je vais retourner à  mes bindings, un peu déçu.

Est ce qu'on peut faire un rapport de bug à  Apple ? Après tout on dirait que c'est eux qui l'ont mis ce champ. D'ailleurs l'appli Carbon fait pareil ..

Je mets l'appli cocoa en zip pour ceux qui ont envie d'essayer sans télécharger tout le matériel sur le ftp apple. Il faut un scanner qui fonctionne avec Transfert d'image..

Réponses

  • NoNo Membre
    03:52 modifié #2
    Essaie de travailler avec la fenêtre.
    Ton NSTextField est attaché à  une fenêtre : essai de récupérer l'instance (méthode window).
    Après quoi en analysant le titre de la fenêtre, ou bien en récupérant son windowNumber, puis dans l'appli Quartz Debug en repérant cette fenêtre, tu peux avoir une piste d'où provient de ce champ texte.
  • laudemalaudema Membre
    03:52 modifié #3
    dans 1239118472:

    Essaie de travailler avec la fenêtre.
    Ton NSTextField est attaché à  une fenêtre : essai de récupérer l'instance (méthode window).

    Hélas non
    po [0x1ef9f0 window]
    Cannot access memory at address 0x0

    Tu peux télécharger le fichier et regarder, c'est du code brut de chez Apple, l'archive ne pèse que 40ko, le "code" tient en 10 lignes et un seul nib avec une seule fenêtre dont le content view n'a qu' un seul bouton. Aucun lien dans l'explorateur depuis aucun objet, aucune connexion autre que le bouton et son IBAction qui n'est pas un lien ...

    Pour voir ... j'ai viré le nib et tenté d'en refaire un. J'avais perdu le menu et n'ai pas trouvé comment refaire le "MainMenu". En repartant de l'archive j'ai ouvert le jumeau du nib de départ et l'ai fait glisser. Il apparaà®t mais reste grisé : je suis obligé de quitter depuis Xcode. Pas grave mais je voudrais savoir comment on peut définir son premier menu à  partir de rien ?

    Sinon en rajoutant une fenêtre et un bouton (et l'appController) je peux toujours lancer le code qui lance le scan qui ramène l'image et puis qui plante tout comme avant avec l'ancien nib:

    Here's the current observation info:
    <NSKeyValueObservationInfo 0x16029a50> (
    <NSKeyValueObservance 0x1600b1e0: Observer: 0x1602b000, Key path: notificationString, Options: <New: NO, Old: NO, Prior: NO> Context: 0x133280, Property: 0x160160a0>
    )
    (gdb) po 0x1602b000
    <NSKeyValueObservance 0x1602b000: Observer: 0x1602aad0 ...

    (gdb) po 0x1602aad0
    <NSTextValueBinder: 0x1602aad0>{object: <NSTextField: 0x1f8860>, bindings: value=icScanner.notificationString}
    (gdb) po 0x1f8860
    <NSTextField: 0x1f8860>

    Et le textfield qui a un pointeur n'a toujours pas de fenêtre à  lui
    (gdb) po [0x1f8860 window]
    Cannot access memory at address 0x0
    i m'énerve ...
    J'ai aussi tenté :
    NSSet *pourVoir = [NSSet keyPathsForValuesAffectingValueForKey:@icScanner.notificationString];
    avec tout un tas de clé mais aucune ne m'a ramené quelque chose d'autre qu'un dictionnaire vide ..

    Merci de ta réponse
Connectez-vous ou Inscrivez-vous pour répondre.