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