У меня была та же самая проблема, делающая что-то похожее, и после дальнейших исследований я обнаружил, что я переиздал. Согласно документам Core Foundation :
Если вы создаете или копируете Core
Основание объекта, вы должны
впоследствии отпустите его, когда вы
покончил с этим.
Я понимаю, что это означает, что функции со словом Get не должны быть выпущены вами. Если вы это сделаете, это вызовет проблему позже, когда реальный владелец попытается выпустить его. Итак, в этом случае, когда вы делаете:
ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);
и позже:
CFRelease(recordRef);
вы выпускаете что-то, что не должно быть выпущено. Намного позже, когда вы сделаете:
CFRelease(allPeopleRef);
массив попытается освободить все свои записи, не зная, что вы уже выпустили некоторые из них. В результате ваша ошибка. Комментируя эту строку, вы, возможно, допустили ошибку, но я боюсь, что вы создали утечку памяти.
Я предлагаю вам не вызывать CFRelease
на Получить указатели методов и не вызывать его на Создать или Копировать указатели методов (возможны исключения это правило, но пока оно работает для меня).