मेरे पास एक ऐप है जो कभी-कभी ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() द्वारा लौटाए गए सरणी के कारण दुर्घटनाग्रस्त हो जाता है, जिसमें ABAddressBookGetPersonCount() के लिए एक अलग आकार होता है। कोड का खोल नीचे दिखाया गया है। आम तौर पर nPeople सरणी के समान आकार है। हालांकि, एक उपयोगकर्ता के आईफोन पर (या कम से कम, जैसा कि एक उपयोगकर्ता द्वारा रिपोर्ट किया गया है), nPeople लगभग दोगुनी है। मैं ABAddressBookGetPersonCount() के बजाय सरणी आकार का उपयोग करके क्रैश को रोक सकता हूं। हालांकि, मुझे यकीन नहीं है कि इसका मतलब है कि मैं आईफोन में सभी संपर्कों तक नहीं पहुंच रहा हूं।ABAddressBookCopyArrayOfAllPeople और ABAddressBookGetPersonCount विभिन्न आकारों को वापस लौटाएं
- क्या कोई इस मुद्दे पर पहले आया है?
- संख्याएं अलग क्यों होंगी?
मुझे आश्चर्य हुआ कि समूह में संग्रहीत संपर्कों के साथ ऐसा कुछ करना था (मुझे नहीं पता कि समूह हैं - केवल एक विचार)। इसके अलावा, उपयोगकर्ता के ईमेल पते से, मुझे संदेह है कि वे मोबाइलमे का उपयोग करते हैं। मुझे आश्चर्य हुआ कि क्या मोबाइलमे के साथ समन्वय एक अलग रिकॉर्ड आईडी के साथ डुप्लिकेट बनाएगा, लेकिन मौजूदा संपर्क को हटा नहीं सकता है, कम से कम जहां तक ABAddressBookGetPersonCount() जाता है।
संपादित करें: मैंने इसमें कुछ और देखा है और समस्या के कारण काफी अच्छा विचार है। चूंकि मैं संपर्कों की एक क्रमबद्ध सरणी चाहता था, मैंने ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering() का उपयोग किया। इसके लिए एक पता पुस्तिका स्रोत की आवश्यकता है - मैंने डिफ़ॉल्ट स्रोत का उपयोग किया था। मेरा मानना है कि विभिन्न स्रोत हो सकते हैं - स्थानीय स्रोत और अन्य जैसे एक्सचेंज और मोबाइलमे। इसलिए, मेरी सरणी केवल स्थानीय संपर्कों के साथ खत्म हो जाएगी, जबकि ABAddressBookGetPersonCount() द्वारा लौटाई गई संख्या में सभी स्रोत शामिल होंगे - इसलिए मेरा क्रैश। इसलिए, मुझे लगता है कि मेरे ऐप में स्थानीय डेटा के साथ काम करना बेहतर होगा और ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering द्वारा वापस किए गए सरणी आकार का उपयोग ABAddressBookGetPersonCount के बजाय किया जाएगा।
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}
जिसका अर्थ है ABAddressBookGetPersonCount हमेशा ABAddressBookCopyArrayOfAllPeople से कम होना चाहिए? –
यह निर्भर करता है। यदि अलग-अलग व्यक्ति के पास अतिरिक्त रिकॉर्ड हो तो यह अलग होगा। अगर प्रत्येक व्यक्ति के पास एक संपर्क नंबर है। तो दोनों एक ही होंगे। :) @NikitaP –