在 iOS 上 clone 一個 ABRecord

在 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。

Contents

comments powered by Disqus