Méthodes optionnelles d'un protocol obligatoires ?

GrosquickGrosquick Membre
Bonjour,

En regardant la déclaration du protocol NSTableViewDataSource on peut y voir :

<br />@protocol NSTableViewDataSource &lt;NSObject&gt;<br />@optional<br /><br />/* Required Methods<br />*/<br />- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView;<br />- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;<br /><br />[...]<br /><br />@end<br />


Normalement la directive @optional indique que les méthodes déclarées après celles-ci peuvent ne pas être implémentées. Le commentaire qui vient juste après : "Required Methods" m'a donc logiquement interpellé. Et effectivement après test, un objet de ce protocol considère bien ces deux méthodes comme obligatoire...

J'ai loupé un truc ? :gratte:

Réponses

  • muqaddarmuqaddar Administrateur
    05:26 modifié #2
    Doc de la méthode:

    Note: This method is optional if your application is using Cocoa bindings for providing data to the table view, otherwise it must be implemented.
  • GrosquickGrosquick Membre
    05:26 modifié #3
    Ce que je voulais dire c'est que j'ai du mal à  comprendre le mécanisme "qui fait que".

    Là  j'ai bêtement une classe qui implémente un protocole avec des méthodes @optional qui ne se comportent pas comme telles...

    C'est un peu comme si je déclarais un attribut publique, et qu'à  l'utilisation le runtime me sort que je ne peux pas accéder à  un attribut privé, c'est un poil perturbant...
  • laudemalaudema Membre
    05:26 modifié #4
    Ce qui "fait que" c'est comme ça est, probablement, parce que si c'était autrement ça ne serait pas si bien  <3 <br />On peut vouloir déclarer ce protocole pour d'autres méthodes que les 2 mentionnées et si on a utilisé les bindings qui font qu'on n'en a pas besoin si elles étaient "required" et plus optionnelles on serait quand même obligé de les implanter, ce qui serait ballot..
  • AliGatorAliGator Membre, Modérateur
    05:26 modifié #5
    Non mais la question de Grosquick c'est plutôt :
    - Les méthodes sont déclarées sous @optional, donc pour le compilateur elles sont vues comme optionnelles (le compilo il s'en fout du commentaire "/* Required Method */" lui, il ne voit que le @optional.
    - C'est normal qu'elles soient déclarées comme ça car en effet si je veux utiliser les bindings, j'implémenterai pas ces méthodes
    - Mais dans ce cas, puisque pour le compilo c'est optionnel, comment ça se fait que quand je les implémente pas dans mon code il gueule ?

    Et là  en effet la question est pertinente, puisque le compilateur voit que la méthode a été déclarée @optional, comment ça se fait qu'il me met une erreur quand j'implémente pas la méthode, par quelle magie il se fait qu'il gueule alors que l'interpréteur du compilateur (qui ne voit que le code et se fiche des commentaires) voit la méthode comme optionnelle ? Si elle est déclarée @optional, il ne devrait pas gueuler si elle n'est pas implémenté.

    Après, Grosquick, j'ai pas fait le test moi-même, mais quand tu dis "Et effectivement après test, un objet de ce protocol considère bien ces deux méthodes comme obligatoire..." qu'est ce qui te fait dire ça ? Le compilateur te sort une erreur à  la compilation ? Ou ça plante à  l'exécution ?
  • laudemalaudema Membre
    05:26 modifié #6
    "Au temps" pour moi et mes excuses à  GroQuick.
    Peut être tenter un "clean all targets" avant de lancer la compilation pourrait remettre les choses dans l'ordre ?
    Des fois, avant de chercher à  comprendre, ça suffit ...
    Sinon, peut être il n'a pas utilisé les bindings d'où ralage si la vueTableau cherche les dites méthodes dans le delegate ?
    On y verra plus clair avec les messages d'erreur..
  • AliGatorAliGator Membre, Modérateur
    05:26 modifié #7
    Oui pour moi quand il dit qu'il a une erreur, c'est au runtime (exception) et là  c'est normal.
    Si c'est à  la compilation en effet là  c'est plus étrange
  • GrosquickGrosquick Membre
    05:26 modifié #8
    Effectivement après le post d'Aligator je crois que j'y vois un peu plus clair. J'ai effectivement confondu les erreurs (enfin warnings dans ce cas) du compilateur avec les erreurs du runtime.

    L'erreur que j'avais était bien à  l'exécution :

    <br />2011-06-24 21:32:33.729 SpeakLine[48853:903] *** Illegal NSTableView data source (&lt;SpeakLineAppDelegate: 0x103d154f0&gt;).&nbsp; Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:
    


    Lorsque je coupe la connexion entre mon outlet NSTableView et mon controlleur je n'ai plus d'erreur, ce qui me rassure un peu ;)

    Merci de m'avoir mis la puce à  l'oreille ;)
  • AliGatorAliGator Membre, Modérateur
    05:26 modifié #9
    Me disais bien aussi ;)

    Donc c'est à  l'exécution qu'ils ont dû mettre un code qui regarde s'il y a un binding, ou s'il n'y en a pas si tu implémentes la méthode du datasource... et si tu ne fais ni l'un ni l'autre, là  te pète à  la tronche ^^
Connectez-vous ou Inscrivez-vous pour répondre.