Технические вопросы и ответы QA1404

Катастрофический отказ в ABAddPropertiesAndTypes

Q: Я попытался добавить пользовательские типы свойства к Адресной книге, но мои сбои приложения, когда я вызываю ABAddPropertiesAndTypes. Что случилось?

A: Я попытался добавить пользовательские типы свойства к Адресной книге, но мои сбои приложения, когда я вызываю ABAddPropertiesAndTypes. Что случилось?

При построении словаря новых свойств для передачи в ABAddPropertiesAndTypes, Вы определяете тип данных нового свойства (например, kABStringProperty. Эти идентификаторы имеют тип ABPropertyType, но ABAddPropertiesAndTypes ожидает, что они будут обернуты в CFNumber объекты. Код, явно добавляющий тип, постоянный в словарь новых свойств, перестанет работать.

Два отрывка кода упоминаются ниже для демонстрации специфических особенностей этой проблемы. Код в Перечислении 1 перестанет работать, когда выполнено; код в Перечислении 2 демонстрирует, как правильно вызвать ABAddPropertiesAndTypes.

Перечисление 1  неправильный способ вызвать ABAddPropertiesAndTypes

ABAddressBookRef  abRef = ABGetSharedAddressBook();
ABPropertyType    type  = kABStringProperty;

CFMutableDictionaryRef propsAndTypes = CFDictionaryCreateMutable(NULL, 1, NULL, NULL);

// This is the problem. kABStringProperty is added as-is, when it should be wrapped in a CFNumber.
CFDictionaryAddValue(propsAndTypes, CFSTR("my.new.property"), &type);
printf("Added %d properties\n", ABAddPropertiesAndTypes(abRef, kABPersonRecordType, propsAndTypes));

CFRelease(propsAndTypes);

Перечисление 2  правильный способ вызвать ABAddPropertiesAndTypes

ABAddressBookRef  abRef = ABGetSharedAddressBook();
ABPropertyType    type  = kABStringProperty;

CFMutableDictionaryRef propsAndTypes = CFDictionaryCreateMutable(NULL, 1, NULL, NULL);

// Note the additional line here, and the passing of a CFNumberRef instead of an ABPropertyType
CFNumberRef  numberRef = CFNumberCreate(NULL, kCFNumberSInt32Type, &type);
CFDictionaryAddValue(propsAndTypes, CFSTR("my.new.property"), numberRef);
printf("Added %d properties\n", ABAddPropertiesAndTypes(abRef, kABPersonRecordType, propsAndTypes));

CFRelease(numberRef);
CFRelease(propsAndTypes);


История версии документа


ДатаПримечания
04.04.2005

Фиксированный типографская ошибка.

15.03.2005

Новый документ это, как правильно добавить пользовательское использование свойств Address Book ABAddPropertiesAndTypes