[Résolu] Peut-on différencier un objet CFData d'un CFMutableData

LexxisLexxis Membre
mai 2015 modifié dans API AppKit #1
Bonjour,
 
 
J'ai un pointeur du type CFTypeRef qui peut recevoir une référence sur un objet CFData ou CFMutableData.
 
Je suis sûr qu'il doit exister un truc tout simple mais je n'arrive pas à  différencier les objets CFData des objets CFMutableData...
 
Auriez vous une petite idées ?

Réponses

  • jpimbertjpimbert Membre
    mai 2015 modifié #2

    Fonction CFGetTypeID


    Il faut comparer le Type ID obtenu à  celui d'un CFData ou d'un CFMutableData connu.


     


     


    [Edit] Non, en fait ça marche pas, les deux types ont le même CFTypeID. Pas Glop.


  • LexxisLexxis Membre

    Oui c'est ce que je voulais utiliser, mais apparemment les objets CFData et CFMutableData ont le même CFTypeID.


  • Avec du Toll Free Bridging on s'en sort



    NSData *data = [@String dataUsingEncoding:NSUTF8StringEncoding];
    CFDataRef dataRef = CFDataCreate(NULL, [data bytes], [data length]);
    CFMutableDataRef mutRef = CFDataCreateMutable(NULL, 1000);
    NSData *convert;
    convert = (__bridge NSData *)dataRef;
    NSLog(@CFDataRef class : %@",NSStringFromClass([convert class]));
    convert = (__bridge NSData *)mutRef;
    NSLog(@CFMutableDataRef class : %@",NSStringFromClass([convert class]));

  • LexxisLexxis Membre

    Hélas le projet ne doit pas avoir recours au Framework Foundation (pas du tout d'objective C).


     


    De plus j'avoue que cet exemple me laisse perplexe puisque j'ai comme résultat la classe __NSCFData dans les deux cas. Cela dépend peut être de la version d'OS X (Yosemite chez moi).


     


    C'est étonnant qu'il n'y ai pas un moyen simple de pouvoir savoir si un CFData est modifiable. J'ai bien vu dans les sources de CFData qu'un fonction existe mais elle est privée.



  • De plus j'avoue que cet exemple me laisse perplexe puisque j'ai comme résultat la classe __NSCFData dans les deux cas. Cela dépend peut être de la version d'OS X (Yosemite chez moi).




     


    Ha oui. Je n'avais pas les yeux en face des trous. ça marche pas mon truc.

  • Je ne sais pas si c'est toujours d'actualité:


    Faire un essai de modification du data/mutableData dans une section de type TRY ..... ENDTRY et on intercepte l'erreur. Si erreur il est probable que c'est un DATA, sinon c'est un MutableDATA. OUAIS, c'est marteau-pilon !


    Qui plus est, je ne sais plus comment on fait ça exactement!


  • Je viens d'aller voir "TRY".  try et end try s'utilisent en AppleScript. Je crois me rappeler qu'il y a quelque chose sur le même principe en Objective-C. Je ne retrouve pas, mais les pros du forum doivent connaitre ça. 


  • CéroceCéroce Membre, Modérateur
    @tablier: pas d'ObjC, il a dit le monsieur.
  • Bon, bon, je n'ai rien dit!  (svp, pas sur la tête)


  • Pas de regret, de toutes façons il est indiqué dans la doc de Core Foundation que ces petites bêtes là , lorsqu'elles sont appelées n'importe comment, et bien elles font n'importe quoi. Elles ont même pas la politesse de jeter une bonne Exception.




  • Pas de regret, de toutes façons il est indiqué dans la doc de Core Foundation que ces petites bêtes là , lorsqu'elles sont appelées n'importe comment, et bien elles font n'importe quoi. Elles ont même pas la politesse de jeter une bonne Exception.




     


    "the behavior is not defined"... Merci la doc.


     


    Je pensais traquer les exceptions (s'il y en avait) mais je trouve que ça fait bricolage...


     


    Bon je vais changer mon implémentation. Merci pour votre aide.

  • Bon ben... on peut pas.


     


    Au fait... comment passer le sujet en résolu ?


  • 1/ Il faut utiliser l'éditeur complet et modifier le premier post


     


    2/ Pour moi ce n'est pas résolu ! Ou alors il faut changer le titre du post.


  • 1/ Il faut utiliser l'éditeur complet et modifier le premier post


    Merci pour l'information. 
     

    2/ Pour moi ce n'est pas résolu ! Ou alors il faut changer le titre du post.


    Certes le "on peut pas" est un peut simple comme solution.
    Il n'y a cependant aucun moyen (une fonction OS j'entend, du style CFDataIsMutable) de faire une distinction entre un CFData et un CFMutableData.
  • Le titre actuel est "Différencier ...". Donc ce n'est pas résolu.


    Si le titre est "Peut-on différencier ...", alors on peut dire que c'est résolu puisque tu as répondu à  la question.


     


    Tu peux changer le titre en même temps que tu marques le sujet comme résolu (dans le titre en fait).


  • AliGatorAliGator Membre, Modérateur
    mai 2015 modifié #17
    CoreFoundation est linké avec "libobjc" donc même si tu ne veux pas passer par le Bridging pour ne pas avoir à  utiliser Cocoa, tu as quand même accès au Runtime ObjC.

    Du coup tu peux normalement faire un appel à  [(id)dataRef respondsToSelector:@selector(appendData:)] pour vérifier si le CFTypeRef, interprété comme un objet générique (id), répond ou non au sélecteur.

    Si tu ne veux pas du tout écrire d'Objective-C mais tout faire en C, tu dois pouvoir faire l'équivalent avec les fonctions C de <objc/runtime.h>.
  • Comme les objets ne seront pas instanciés par le runtime Objc, la classe de base sera __NSCFData (comme l'exemple de jpimbert #4), du coup les tests sur les sélecteurs je ne sais pas trop...


     


    Dans les tests l'ajout de données à  un objet CFData (théoriquement non modifiable) ne pose apparemment pas de problème (cela doit être ça les "the behavior is not defined"...) alors que la même opération sur un objet NSMutableData (objc) provoque une erreur (mais bon dans ce cas ce n'est pas un __NSCFData qui est utilisé)


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