Ho un'app che si arresta in modo anomalo occasionalmente a causa dell'array restituito da ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() di dimensioni diverse rispetto a ABAddressBookGetPersonCount(). La shell del codice è mostrata sotto. Di solito nPeople ha le stesse dimensioni dell'array. Tuttavia, sull'iPhone di un utente (o almeno, come riportato da un utente), nPeople è quasi due volte più grande. Posso fermare l'arresto utilizzando la dimensione dell'array, piuttosto che ABAddressBookGetPersonCount(). Tuttavia, non sono sicuro che ciò significhi che non accedo a tutti i Contatti nell'iPhone.ABAddressBookCopyArrayOfAllPeople e ABAddressBookGetPersonCount restituiscono diverse dimensioni
- Qualcuno ha mai incontrato prima questo problema?
- Perché i numeri dovrebbero essere diversi?
Mi chiedevo se fosse qualcosa a che fare con i contatti memorizzati in Gruppi (non so che ci sono gruppi - solo un'idea). Inoltre, dall'indirizzo email dell'utente, ho il sospetto che usino MobileMe. Mi chiedevo se la sincronizzazione con MobileMe creerebbe duplicati con un recordId differente, ma non eliminare il contatto esistente, almeno non fino a quando ABAddressBookGetPersonCount().
MODIFICA: Ho esaminato un po 'di più e ho una buona idea della causa del problema. Poiché volevo una serie ordinata di contatti, ho usato ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(). Ciò richiede una fonte della rubrica: ho usato la fonte predefinita. Credo che ci possano essere varie fonti: la fonte locale e altre come Exchange e MobileMe. Pertanto, il mio array finirà con solo i contatti locali, mentre il numero restituito da ABAddressBookGetPersonCount() includerà tutte le fonti - da qui il mio crash. Pertanto, penso che sarebbe meglio lavorare con i dati locali nella mia app e utilizzare la dimensione dell'array restituita da ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering piuttosto che da ABAddressBookGetPersonCount.
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}
che significa che ABAddressBookGetPersonCount deve sempre essere inferiore a ABAddressBookCopyArrayOfAllPeople? –
Dipende. Sarà diverso se la stessa persona potrebbe avere record extra. Se ogni persona ha un solo numero di contatto. Allora entrambi saranno uguali. :) @NikitaP –