在 OSX 中,要建立一個 ABRecord 的副本(clone)可以用 ABRecordCreateCopy
這個 function,但是這個 function 在 iOS 上卻沒有實作,如果要自己做,變成要自己抓出一個個屬性,然後慢慢 copy,怎麼想都很煩,尤其 ABRecord 又會跟 AddressBookDB 連動,處理起來相當麻煩,常常不小心就更動到 AddressBookDB 裡面的資料。
後來想到一個很簡單的方法,先把 ABrecord 轉成 vCard,再把 vCard 轉成 ABRecord 就成了,所以用如下的 function 即可:
ABRecordRef ABRecordCreateCopy (ABRecordRef record)
{
ABRecordRef people[1] = {record};
CFArrayRef peopleArray = CFArrayCreate(NULL, people, 1, &kCFTypeArrayCallBacks);
CFDataRef vCardData = ABPersonCreateVCardRepresentationWithPeople(peopleArray);
ABRecordRef source = ABPersonCopySource(record);
ABRecordRef duplicatedPerson = ABPersonCreatePeopleInSourceWithVCardRepresentation(source, vCardData);
ABRecordRef returnedPerson = CFArrayGetValueAtIndex(duplicatedPerson, 0);
CFRelease(source);
CFRelease(vCardData);
CFRelease(duplicatedPerson);
return CFRetain(returnedPerson);
}
要注意的是,根據慣例,傳回的 instance retain count 是 1,不用了之後必須自己CFRelease
掉,不然會有 leak。