Катастрофический отказ в 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 |