Problème avec NSMutableData

regattaregatta Membre
11:18 modifié dans API AppKit #1
Bonjour,

j'ai un problème avec une données de type NSMutableData !
Voici le code :

<br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface TestAppDelegate : NSObject &lt;NSApplicationDelegate&gt; <br />{<br />&nbsp; &nbsp; NSWindow		*window;<br />&nbsp;  NSMutableData	*donnees;<br />}<br /><br />@property (assign) IBOutlet NSWindow *window;<br />@property (readwrite, copy) NSMutableData *donnees;<br />@end<br />


Dans la méthode applicationDidFinishLaunching, j'initialise la NSMutableData et je vérifie le type de la donnée.

<br />#import &quot;TestAppDelegate.h&quot;<br /><br />@implementation TestAppDelegate<br /><br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification <br />{<br />	[self setDonnees:[NSMutableData dataWithLength:1]];<br />	NSString *name = [[self donnees] className];<br />}<br /><br />@synthesize window;<br />@synthesize donnees;<br /><br />@end<br />


la valeur de name est NSConcreteData et non NSConcreteMutableData  B)

Pourquoi tant de haine  :'(
Cela doit être simple, mais je sèche depuis un moment !

Merci pour vos lumières

Réponses

  • AliGatorAliGator Membre, Modérateur
    septembre 2011 modifié #2
    Attends tu veux dire que tu fais des tests pour savoir si une instance est de telle ou telle classe, tu demandes son className pour regarder ça ??

    Il faut toujours passer par les méthodes comme [tt]isKindOfClass:[/tt] pour savoir si une classe est d'un type donné. Avec les particularités des Class Clusters, ainsi qu'avec des classes qui sont toll-free-bridged avec CoreFoundation et donc ont des types internes pas forcément directement liés au nom de classe que tu manipules...

    Moi ça me choque pas de voir le type NSConcreteData, c'est un type interne tu sais pas s'il est mutable ou pas... en général l'aspect "mutable" n'est géré que par le fait que l'API est exposée ou non)
  • regattaregatta Membre
    11:18 modifié #3
    J'ai fait le test car j'ai un dump sur un autre programme qui me dit :

    <br />-[NSConcreteData replaceBytesInRange:withBytes:]: unrecognized selector sent to instance 0x125ded230<br />HIToolbox: ignoring exception &#039;-[NSConcreteData replaceBytesInRange:withBytes:]: unrecognized selector sent to instance 0x125ded230&#039; that raised inside Carbon event dispatch<br />
    


    Mais si je fais le test avec isKindOfClass, j'ai la même réponse : NSData et non NSMutableData !

    <br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification <br />{<br />	[self setDonnees:[NSMutableData dataWithLength:1]];<br />	if ([[self donnees] isKindOfClass:[NSData class]] == YES)<br />	{<br />		BOOL ko = YES;<br />	}<br />}<br />
    


    Mais je n'ai peut-être pas compris ta réponse  :(
  • DrakenDraken Membre
    11:18 modifié #4
    isKindOfClass: ne te donne pas le "type" d'une classe. Elle indique si une classe dérive d'une autre classe. NSMutableData est forcément un héritier de NSDATA.

    As-tu essayé comme ça ?

    <br />if ([[self donnees] isKindOfClass:[NSMutableData class]] == YES)<br />{<br />	BOOL ko = YES;<br />}<br />
    


  • regattaregatta Membre
    11:18 modifié #5
    Oui, j'ai commencé par cela et le test est négatif !
  • DrakenDraken Membre
    septembre 2011 modifié #6
    Ah zut  :( ! * regarde le sol avec honte *

    Et avec une classe personnalisée dérivant de NSMutableData ?

  • tabliertablier Membre
    11:18 modifié #7
    et en plus simple:
  • zoczoc Membre
    septembre 2011 modifié #8
    Manifestement, le problème vient du fait que la propriété "données" possède l'attribut "copy" (dont je ne vois franchement pas l'intérêt mais bon...). Ca voudrait dire qu'une copie d'un NSMutableData n'est pas mutable, bien que je n'ai trouvé nulle part dans la doc. une telle information (et que personnellement je trouve stupide s'il s'avère que c'est le cas)...


    Edit: Ah bah si, la documentation du protocole NSCopying indique explicitemement que la copie d'un objet mutable est immutable... Il faudrait utiliser NSMutableCopying, mais à  ma connaissance rien dans les attributs de propriété ne permet de le spécifier.

    The returned object is implicitly retained by the sender, who is responsible for releasing it. The copy returned is immutable if the consideration “immutable vs. mutable” applies to the receiving object; otherwise the exact nature of the copy is determined by the class.
  • regattaregatta Membre
    11:18 modifié #9
    :D

    Effectivement, avec
    @property (readwrite, assign) NSMutableData *donnees;

    cela marche parfaitement !

    Merci à  tous
  • zoczoc Membre
    11:18 modifié #10
    Normal.


    Maintenant, la question que tu dois te poser, c'est "pourquoi j'avais utilisé copy", car ça peut être le signe d'une certaine confusion dans ton esprit pour tout ce qui concerne la gestion mémoire.

  • AliGatorAliGator Membre, Modérateur
    11:18 modifié #11
    Ouch, passer de [tt]copy[/tt] (qui, je suis d'accord avec zoc, est rarement utile) à ... [tt]assign[/tt] où là  par contre du coup fait que la propriété n'est plus retenue par l'objet (et que l'objet n'en est plus le "possesseur" de cet objet mais ne fait plus que pointer dessus) du coup tu risques d'avoir un plantage assez rapidement par la suite ! (surtout si tu fais un [tt][self setDonnées:[NSMutableData dataWith...]][/tt] et donc affecte un objet autoreleased à  ta propriété...)

    Du coup je rejoins zoc sur une probable confusion dans ton esprit sur la gestion mémoire...
Connectez-vous ou Inscrivez-vous pour répondre.