Bindings ? Zombie Observer me pourrit la vie ..

laudemalaudema Membre
05:53 modifié dans API AppKit #1
Bonjour,

  A la base mon souhait est de pouvoir faire comme Aperçu dans le menu Fichier -> Importer une image. Quand on fait ça l'application Transfert d'Images se lance, on fait le scan, avec toutes les options qui vont bien via un aperçu auparavant, puis elle se referme et l'image scannée se retrouve dans Aperçu où l'on a plus qu'à  en disposer.

  Pour ça Apple propose une fonction Carbon "ICAImportImage" et donne un exemple avec Cocoa (que je mets en fichier joint). Cet exemple fonctionne bien mais quand la fonction se finit la console est envahie de messages d'erreur à  propos d'un observateur enregistré alors que le scanner veut se retirer:
"An instance 0x1f66a0 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."
"An instance 0x1f88b0 of class ICScanHelper is being deallocated while key value observers are still registered with it ..."
An instance 0x1f9300 of class ICScannerGeometry is being deallocated while key value observers are still registered with it ...

Avec à  chaque fois un gros paquet nerveux de "observation info" que je n'ai pas remis ici.

J'ai découvert à  cette occasion quelques trucs et astuces sur le debugger (file:///Developer/Documentation/DocSets/com.apple.ADC_Reference_Library.DeveloperTools.docset/Contents/Resources/Documents/technotes/tn2004/tn2124.html#SECOBJECTIVEC) et je sais donc qu'il s'agit d'un NSTextField mais pourtant il n'y a aucun champ texte dans l'appli de démo.

Pas découragé pour autant j'ai quand même essayé d'implanter ICAImportImage dans mon application. Pour ça il m'a aussi fallu apprendre de quoi comprendre Carbon.
Comme c'est le scanner qui rouspète j'ai tenté de prendre ICAApplication.h du début à  la fin comme dans un des autres exemples du SDK qu'on peut télécharger à  ftp://ftp.apple.com/developer/Development_Kits/Image_Capture_SDK2.0.dmg.bin . J'ai su trouver mon scanner et ouvrir une session mais alors importImage ne veut plus se lancer: Scanner déjà  utilisé ! Et je n'ai pas eu envie de me lancer en plus dans le travail sur l'image qu'on peut faire depuis Transfert d'Images (retourner, cadrer, changer luminosité, contraste, netteté etc).

Ensuite j'ai tenté de récupérer l'objet scanner en m'enregistrant comme observateur des notifications. J'arrive à  le trouver [notification object] et j'ai essayé de supprimer self comme observateur des liaisons de l'object scanner. ça n'a pas marché ...

Finalement j'ai regardé pour le lancer dans un thread différent et j'ai découvert NSOperation où j'ai bien mis isConcurrent à  YES, des fois que les avertissements iraient dans un thread à  part et ne seraient plus visibles. Bien sûr ça n'a pas fonctionné et le zombie est toujours réclamé  :0(. Alors ...

S'agit il d'un oubli d'Apple dans sa fonction "importImage" ? Si oui puis je le signaler comme bug sur le site d' Apple ?

Y a t-il moyen de ressusciter un zombie pour mieux l'achever ? ;)

Plus simple probablement : comment supprimer les logs de sortie en les envoyant "au diable" retrouver les morts-vivants et les récupérer une fois le scan fait pour bénéficier de mes "NSLog" ?

Merci de vos idées.

Réponses

  • Philippe49Philippe49 Membre
    05:53 modifié #2
    dans 1240500097:

    "An instance 0x1f66a0 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."
    "An instance 0x1f88b0 of class ICScanHelper is being deallocated while key value observers are still registered with it ..."
    An instance 0x1f9300 of class ICScannerGeometry is being deallocated while key value observers are still registered with it ...


    Je ne connais pas ce framework, mais à  la vue de ce que tu dis je ferais deux remarques :

    • Manifestement des objets reçoivent un release les faisant disparaà®tre sans que les observateurs de ces objets ne soient "déconnectés"
    • Le projet date de 2002/2003 le début des bindings, si bindings il y a (mais le KVO est un indice positif) je ne suis pas certain que le fonctionnement soit resté le même. C'est un même n .pbproject .. c'est dire que cela ne nous rajeunit pas. 

    Si tu essaies le sample code intact, c'est qu'il ne marche plus maintenant, et que sans doute il manque des instructions du genre "unbind" ou "removeObserver" ou que sais-je encore.

    D'autre part quand on lit "ICApplication.h" on trouve quand même beaucoup de lignes avec la mention "This API is deprecated in 10.5."

    A ta place, je regarderais si Apple n'aurais pas remplacé cet API par une nouvelle, laissant comme à  son habitude en deprecated mais toujours existant une vieille version ? (je ne connais pas le sujet du scanner)
  • laudemalaudema Membre
    05:53 modifié #3
    dans 1240511778:


    Si tu essaies le sample code intact, c'est qu'il ne marche plus maintenant, et que sans doute il manque des instructions du genre "unbind" ou "removeObserver" ou que sais-je encore.

    Ah mais oui ! Je connais même le coupable : un NSTextField. Bien sûr il change d'adresse à  chaque fois, c'est dommage sinon j'essayerais de lui régler son sort auparavant ;-/ Avant l'appel à  la fonction ICAImportImage il n'existe pas, après il n'existe plus ! J'en ai donc déduit que les gens de chez Apple l'ont utilisé pour mettre au point l'exemple puis supprimé ou plutôt égaré dans un copier coller et qu'il est dans un coin de la fonction compilée ... J'ai donc essayé de me retirer comme observateur de tout ce qui est en rapport avec le scanner mais ça ne change rien.
    En plus mes logs ont droit à  des expressions qui ne sont pas vraiment des notifications mais ressemblent plutôt à  des logs que j'aurais mis moi dans mon programme pour voir où j'en suis, d'ailleurs il y a des *** devant :
    *** documentScanDoneNotification, après l'aperçu
    *** pageScanDoneNotification, après le scan..
    *** documentScanDoneNotification, un dernier avant de rentrer dans les erreurs d'objet desalloué ..
    Mes ces logs ne sont renseignés nulle part et rien n'indique où s'enregistrer: j'ai utilisé nil pour objet et nil pour notification, après j'ai filtré pour ne pas avoir les windows resize et autres menus qui s'initialisent. Après j'ai récupéré l'objet scanner dans la première notification qu'il envoie pour me désabonner du reste et me réabonner à  lui seul, et j'ai fini par faire un tableau avec des dictionnaires qui contenaient le nom de la notification et un compteur à  chaque. C'est fou ce qu'on apprend dans ces cas là  en fait :-)
    Résultat (le tableau n'est pas trié):
        ICOverviewScanDone = 1;
        ICScanDone = 1;
        ICScanDoneNotification = 2;
        ICScanStarted = 1;
        ICScannerGotPropertyDictionary = 2;
        ICScannerHandlerBecameActive = 1;
        ICScannerUpdatePartialScanWithData = 10;
        ICScannerUpdatePartialScanWithNoData = 1;
        ICScannerUserSelectionDidChange = 3;
    La pire c'est ICScannerUpdatePartialScanWithData parce qu'elle envoie le data de l'image dans le userinfo ..
    Mais aucune des trois que m'envoie la fonction avec leurs *** en préfixe.

    dans 1240511778:


    D'autre part quand on lit "ICApplication.h" on trouve quand même beaucoup de lignes avec la mention "This API is deprecated in 10.5."

    A ta place, je regarderais si Apple n'aurais pas remplacé cet API par une nouvelle, laissant comme à  son habitude en deprecated mais toujours existant une vieille version ? (je ne connais pas le sujet du scanner)

    Oui et non. Oui j'ai été regarder et non il n'y a rien. D'un autre côté il y a plein de nouvelles notifications dans ICAApplication.h c'est donc la dernière version, d'ailleurs il n'y a plus que celles là  AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER (il y en a beaucoup trop pour que je les colle ici) et je ne sais pas où sont les anciennes. 
    L'impression que j'en retire est que je ferais mieux de m'abonner "payant" pour avoir peut être la dernière version qui marche et que ce n'est peut être pas un hasard ...
  • zoczoc Membre
    05:53 modifié #4
    dans 1240518151:

    L'impression que j'en retire est que je ferais mieux de m'abonner "payant" pour avoir peut être la dernière version qui marche et que ce n'est peut être pas un hasard ...


    Si l'abonnement payant pour le développement sur iPhone a un sens, l'abonnement payant pour le développement sur Mac en a beaucoup moins, car il n'apporte strictement rien de plus en ce qui concerne les outils de développement et frameworks disponibles.

    Les principal intérêt de l'ADC payant, ça reste en gros l'accès aux bêtas des futures version d'OSX. Tout ce qui concerne le développement sur Mac est déjà  disponible avec l'ADC gratuit.

  • laudemalaudema Membre
    05:53 modifié #5
    dans 1240753813:


    Les principal intérêt de l'ADC payant, ça reste en gros l'accès aux bêtas des futures version d'OSX. Tout ce qui concerne le développement sur Mac est déjà  disponible avec l'ADC gratuit.


    Mon souci est que souvent je perds du temps avec le matériel mis à  disposition. D'un autre côté c'est excellent pour mon "usinage" personnel.

      Pour importImage, ici, j'ai appris à  utiliser les fonctions Carbon, ce qu'était un arrayRef, comment ça se crée et ça s'utilise, comment on appelle une fonction en lui passant des valeurs, à  quoi sert le "casting" et comment on fait.
    Du temps aussi pour voir comment re-diriger les messages de la console, pas du temps perdu non plus et peut être l'objet d'un futur message quand je voudrais le faire "proprement" ;-)

      Avec SimpleCalendar, quand j'ai voulu me changer les idées, ça a été une autre prise de tête: il compile avec l'ancien Framework dans les réglages et des bouts de code appellent des méthodes avant de NSPredicate maintenant de CalCalendarStore. Là  encore j'ai vu en pratique ce que j'avais lu ailleurs sans aller plus loin que recopier l'exemple ...

    Peut être que les enregistrés payant ont droit à  des versions plus "propres" des démos. Sinon on a aussi droit à  deux appels au secours et c'est peu ! Sauf si on peut demander "je veux une interface avec tous les contrôles et les bindings, sans oublier undo, pour pouvoir lire et modifier toutes les propriétés des enregistrements de ICal autant les événements que les tâches" :-)
    Dans le doute de pouvoir poser ce genre de questions, et la crainte d'en griller une des deux rien qu'à  demander si je peux, j'ai préféré m'abstenir.
    Et puis finalement j'apprécie de trouver (seul !) ce qui ne va pas... D'ailleurs il ne me reste plus que l'objet CalRecurrenceRule à  appréhender.

    Donc pour l'instant je continue sans abonnement. Peut être aussi si l'envie me prend d'acheter une nouvelle machine mais j'ai regardé l'offre et c'est plutôt chiche.
    Merci de ton apport.
  • zoczoc Membre
    05:53 modifié #6
    dans 1240759947:
    Peut être que les enregistrés payant ont droit à  des versions plus "propres" des démos.


    Non, même pas.

    Sinon, de mon coté, j'utilise souvent les mailings lists officielles d'Apple (notamment cocoa-dev et xcode-users), qui sont fréquentées par de nombreux développeurs confirmés et par des ingénieurs d'Apple. C'est une mine inépuisable d'informations...


Connectez-vous ou Inscrivez-vous pour répondre.