Sie können nicht einfach ein NSData
Objekt an eine CFDataRef
übertragen; wie in the docs erwähnt, ein CFDataRef
ist eine „Referenz auf ein unveränderliches cfdata Objekt“, das nicht das gleiche wie eine NSData
Instanz ist:
typedef const struct __CFData *CFDataRef;
Um die CFDataRef
aus der NSData
Instanz zu erstellen, müssen Sie die CFDataCreate
verwenden Verfahren, das Bytes und Länge vorbei:
NSData *dataRef = UIImagePNGRepresentation([UIImage imageNamed:@"contact3.png"]);
CFDataRef dr = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
Beachten Sie auch, dass, da Sie das Objekt selbst zu erstellen, müssen Sie auch loslassen, nach den Core Foundation Ownership Policy; Sie verwenden die Funktion CFRelease
Eigentum an der Core Foundation-Objekt freizugeben:
CFRelease(dr);
Dies ist ähnlich wie die Speicherverwaltung in Cocoa, und sobald die Beibehaltungszähler des Objekts Core Foundation Null erreicht wird freigegeben werden.
Edit:Stefan
war völlig richtig, in seinem Kommentar, dass NSData
und CFData
sind auch gebührenfrei auf dem iPhone mit Cocoa-Touch als mit Cocoa überbrückt, so dass meine ursprüngliche Antwort falsch war. Meine Schuld, sollte es vorher bearbeitet haben.
Danke Perspx. Guter Hinweis. Ich dachte in Cocoa-Touch wäre gebührenfreie Überbrückung zwischen ihnen (wie in Cocoa). Nichtsdestotrotz habe ich gerade versucht, einen frischen CFDataRef mit deinem Snippet zu erstellen. Das ist gleich. Seltsam, ich bekomme keinen Fehler von ABPersonSetImageData zurück. – Stefan
Ok, ich habe es. Es war das Bild. Einige von ihnen funktionieren nicht. Danke für Ihre Hilfe – Stefan
Keine Sorge - froh, dass Sie es behoben haben. –