I want to create an array of ABRecordRef(s) to store contacts which have a valid birthday field.
NSMutableArray* bContacts = [[NSMutableArray alloc] init];
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for( int i = 0 ; i < nPeople ; i++ )
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );
NSDate* birthdayDate = (NSDate*) ABRecordCopyValue(ref, kABPersonBirthdayProperty);
if (birthdayDate != nil){
[bContacts addObject:ref];
}
}
The compiler shows this warning: warning: passing argument 1 of 'addObject:' discards qualifiers from pointer target type I searched the web and found I have to cast ABRecordRef to a ABRecord* to be able to store in a NSMutableArray.
[bContacts addObject:(ABRecord*) ref];
But it seems ABRecord is not part of iOS frameworks. Now how I store ABRecordRef to NSMutableArray?
A ABRecordRef
is a typedef for CFTypeRef
and that in turn resolves to const void *
. And this is where the warning comes from: with the call to addObject:
, the const
qualifier is "lost".
In this case we know it's OK. A CFTypeRef is a semi-highlevel type, instances of this type support CFRetain
and CFRelease
. That in turn means it's probably OK to cast it to id
and treat it as a NSObject. So you should be simply able to do:
[bContacts addObject:(id)ref];