Ваш метод иногда , возвращающий экземпляр с сохранением количества +1, и вы, скорее всего, не выпускаете его в оставшейся части кода. Вы возвращаете с сохранением счетчика +1, если вызывается SecItemCopyMatching, но если установлен publicKey, то ваша функция возвращает значение с сохранением счетчика + -0, что плохо.
Вы должны убедиться, что вы всегда возвращаетесь с одним и тем же счетом удержания. В этом случае я бы сделал:
} else {
publicKeyReference = publicKey;
CFRetain(publicKeyReference);
}
Тогда каждый вызывающий ваш метод должен удостовериться, что CFRelease
значение ... но это нарушит правило get (оно должно вернуть retain count + -0), так что, возможно, это будет будет хорошей идеей переименовать метод.