ABPersonSetImageData не отображает изображение - PullRequest
2 голосов
/ 18 июля 2009

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

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

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

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

1 Ответ

5 голосов
/ 18 июля 2009

Вы не можете просто привести NSData объект к CFDataRef; как отмечено в документах , 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]);

Также обратите внимание, что, поскольку вы сами создаете объект, вы также должны разблокировать его, следуя Базовая базовая политика владения ; вы используете функцию CFRelease для освобождения владельца базового объекта Foundation:

CFRelease(dr);

Это похоже на Управление памятью в Какао, и как только счет сохранения для базового базового объекта достигнет нуля, он будет освобожден.

Редактировать: Stefan был совершенно прав, в своем комментарии, что NSData и CFData также являются бесплатными мостами на iPhone с Cocoa-Touch, как с какао, поэтому мой ответ был неверным. Я виноват в том, что должен был отредактировать его раньше.

...