2009-07-18 3 views
2

Я использую ABUnknownPersonViewController для отображения вида контакта.ABPersonSetImageData не отображает изображение

Я пытаюсь установить изображение с:

NSData *dataRef = UIImagePNGRepresentation([UIImage imageNamed:@"contact3.png"]); 
ABPersonSetImageData(newPersonViewController.displayedPerson, (CFDataRef)dataRef, nil); 

Это не работает, и я не знаю, почему. Есть идеи?

ответ

5

Вы не можете просто отличить объект 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, как с какао, поэтому мой первоначальный ответ был неправильным. Моя ошибка, должен был отредактировать его раньше.

+0

Thank you Perspx. Хороший намек. Я думал, что в Cocoa-Touch будет беспошлинно перемычка между ними (как в Cocoa). Тем не менее, я просто попытался создать новый CFDataRef вашим фрагментом. Это то же самое. Странно, я не получаю ошибки от ABPersonSetImageData. – Stefan

+0

Хорошо, у меня это есть. Это был образ. Некоторые из них не работают. Спасибо за помощь. – Stefan

+0

Не беспокойтесь - рад, что вы ее исправили. –

Смежные вопросы