Vous ne pouvez pas simplement convertir un objet NSData
en CFDataRef
; comme il est indiqué dans the docs, un CFDataRef
est une « référence à un immuable objet CFData », ce qui est la même que celle d'une instance NSData
:
typedef const struct __CFData *CFDataRef;
Pour créer le CFDataRef
de l'instance NSData
, vous devez utiliser le CFDataCreate
méthode, en passant les octets et la longueur:
NSData *dataRef = UIImagePNGRepresentation([UIImage imageNamed:@"contact3.png"]);
CFDataRef dr = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
Notez également que, puisque vous créez l'objet vous-même, vous devez également libérer, après la Core Foundation Ownership Policy; vous utilisez la fonction CFRelease
pour libérer la propriété de l'objet de base Fondation:
CFRelease(dr);
Ceci est similaire à la gestion de la mémoire dans le cacao, et une fois le conserver nombre de l'objet de base Foundation atteint zéro, il sera désallouée.
Edit:Stefan
était tout à fait raison, dans son commentaire, que NSData
et CFData
sont également sans frais pontée sur l'iPhone avec Cocoa-Touch comme avec Cocoa, donc ma réponse initiale était erronée. Ma faute, aurait dû l'éditer avant.
Merci Perspex. Bon indice. Je pensais que Cocoa-Touch serait un pont gratuit entre eux (comme dans Cocoa). Néanmoins, j'ai juste essayé de créer un CFDataRef frais par votre extrait. C'est la même chose. Étrange, je ne reçois aucune erreur de ABPersonSetImageData. – Stefan
Ok, je l'ai. C'était l'image. Certains d'entre eux ne fonctionnent pas. Merci pour votre aide – Stefan
Pas de soucis - content que vous l'ayez corrigé. –