NSData et Mavericks : une méthode rejetée.
Herve
Membre
Bonjour,
Je viens d'updater l'OS et XCode. De Lion, je suis passé à Mavericks.
Dans mon synthé, j'utilise des structures C pour que l'application communique avec l'audio unit.
La méthode "getBytes:lenght" ne marche plus, alors que jusqu'alors, cela fonctionnait très bien.
NSData *data = [NSData alloc];//ça marche
[data initWithContentsOfFile: filePath];//ça marche aussi(filePath est un NSStrings)
[data getBytes:monInstanceDeStructure length:sizeof(MaStructure)];//là , ça plante!
Le compilateur m'indique :
*** -length only defined for abstract class. Define -[_NSPlaceholderData length]!
Notons que la documentation ignore ce que "NSPlaceholderData" veut dire...
L'appli du coup plante à ce moment et ne marche pas.
Auriez-vous une idée? Merci par avance...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est quoi ce code ?!!!!
Ta création d'objet doit TOUJOURS être faite de la sorte :
Lis la doc ! Ton objet peut changer de type et d'adresse au init ! C'est ce qui se passe ici, le NSData alloc ne crée qu'un placeholder en mémoire et c'est ton init qui va créer l'objet réel en fonction des arguments. De fait ton pointeur a changé d'adresse !
Il ne faut JAMAIS éclater l'appel de alloc et d'init.
Bien vu Yoann, c'était bien ça!! Je m'en souviendrai... (Je n'avais pas vu ça dans la doc non plus il faut dire, bien que l'ayant lue!)
Merci beaucoup, le problème est résolu. Merci!
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/init
C'est donc un principe global de NSObject. Je n'avais jamais remarqué. Merci pour le lien.
Le plus souvent, je fais "naturellement"
plus par habitude que pour une autre raison. Je ferai attention désormais à corriger cette erreur si je la retrouve dans mon code.