2

我使用 ABUnknownPersonViewController 来显示联系人视图。

我尝试使用以下方式设置图像:

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

它不起作用,我不知道为什么。有任何想法吗?

4

1 回答 1

5

您不能只将NSData对象强制转换为CFDataRef; 如文档中所述, aCFDataRef是“对不可变 CFData 对象的引用”,它与NSData实例不同:

typedef const struct __CFData *CFDataRef;

要从实例创建CFDataRefNSData您需要使用该CFDataCreate方法,传递字节和长度:

NSData *dataRef = UIImagePNGRepresentation([UIImage imageNamed:@"contact3.png"]); 
CFDataRef dr = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);

另请注意,由于您自己创建对象,因此您还必须按照Core Foundation Ownership Policy释放它;您使用该CFRelease函数来释放 Core Foundation 对象的所有权:

CFRelease(dr);

这类似于 Cocoa 中的内存管理,一旦 Core Foundation 对象的保留计数达到零,它将被释放。

编辑: Stefan在他的评​​论中是完全正确的,NSData并且CFData在 iPhone 上使用 Cocoa-Touch 和 Cocoa 一样也是免费桥接的,所以我原来的答案是错误的。我的错,应该之前编辑过。

于 2009-07-18T14:58:28.567 回答