iPhone SDK: EXC_BAD_ACCESS с CFRelease для ABAddressBookRef

@eed3si9n: я даже предположил бы, что '1' магическое число.:-)

принцип А, это связано с магическими числами, - то, что каждый факт Ваши соглашения о коде с должен быть объявлен точно однажды. При использовании магических чисел в коде (таких как пример длины пароля, который @marcio дал, можно легко закончить тем, что копировали тот факт, и когда Ваш понимать того факта изменяется, у Вас есть проблема обслуживания.

5
задан beefon 30 July 2009 в 20:26
поделиться

2 ответа

У меня была та же проблема, когда я делал что-то похожее, и после дальнейших исследований я обнаружил, что выпускаю слишком много. Согласно Core Foundation docs :

Если вы создаете или копируете Core Объект фонда, необходимо впоследствии отпустите его, когда вы закончил с этим.

Я прочитал, что это означает, что функции со словом Get не должны быть освобождены вами. Если вы это сделаете, это вызовет проблему позже, когда настоящий владелец попытается освободить его. Итак, в этом случае, когда вы делаете:

ABRecordRef recordRef = CFArrayGetValueAtIndex(allPeopleRef, i);

и позже:

CFRelease(recordRef);

, вы выпускаете то, что не должно быть выпущено. Намного позже, когда вы сделаете:

CFRelease(allPeopleRef);

, массив попытается освободить все свои записи, не зная, что вы уже освободили некоторые из них. Результат - ваша ошибка. Комментируя эту строку, вы могли устранить ошибку, но я боюсь, что вы создали утечку памяти.

Я предлагаю вам не вызывать CFRelease на Получить указатели методов и вызовите его в Create или Copy указатели методов (могут быть исключения из этого правила, но пока это работает для меня).

15
ответ дан 18 December 2019 в 14:49
поделиться

allPeopleRef и addressBookRef указывают на одни и те же объекты? Копия наверное неглубокая. Что делает ABAddressBookCopyArrayOfAllPeople?

-2
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: