Вы не можете просто отличить объект NSData
на CFDataRef
; как отмечено в the docs, CFDataRef
является «ссылка на неизменяемый CFData объект», который не является такой же, как NSData
например:
typedef const struct __CFData *CFDataRef;
Для создания CFDataRef
из экземпляра NSData
, вы должны использовать CFDataCreate
метод, передавая байты и длина:
NSData *dataRef = UIImagePNGRepresentation([UIImage imageNamed:@"contact3.png"]);
CFDataRef dr = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
Заметим также, что с момента создания объекта самостоятельно, вы должны освободить его, после Core Foundation Ownership Policy; Вы используете функцию CFRelease
освободить собственности на объект Основной фонд:
CFRelease(dr);
Это похоже на управление памятью в какао, и после того, как сохранить граф объекта ядра фонда достигает нуля будет освобождаться.
Edit:Stefan
был совершенно прав, в своем комментарии, что NSData
и CFData
также бесплатный мостиком на iPhone с какао-Touch, как с какао, поэтому мой первоначальный ответ был неправильным. Моя ошибка, должен был отредактировать его раньше.
Thank you Perspx. Хороший намек. Я думал, что в Cocoa-Touch будет беспошлинно перемычка между ними (как в Cocoa). Тем не менее, я просто попытался создать новый CFDataRef вашим фрагментом. Это то же самое. Странно, я не получаю ошибки от ABPersonSetImageData. – Stefan
Хорошо, у меня это есть. Это был образ. Некоторые из них не работают. Спасибо за помощь. – Stefan
Не беспокойтесь - рад, что вы ее исправили. –