Что является хорошей альтернативой CFRelease для объектов Core Foundation? - PullRequest
0 голосов
/ 12 октября 2011

Я перешел к следующему коду, который после задержки вызовет CFRelease.Я включил его в метод для контекста.

CGPathRef NewPathWithRoundRect(CGRect rect, CGFloat cornerRadius)
{
     // other work to create ref which is a CGPath
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        CFRelease(ref);
    });
}

В последней версии XCode я получаю предупреждение о неправильном освобождении памяти.Вызывающая сторона принимает значение, использует его и затем вызывает CFRelease.Я теперь CFRetain это, а также CFRelease это так, чтобы уменьшить количество ссылок до нуля, я устанавливаю эту диспетчеризацию для запуска и очистки ссылки.

Мне не нравится этот подход.Есть ли лучший шаблон для возврата объектов CF, которые были созданы в методе и должны быть возвращены?Должен ли я создать путь вне метода и передать его в качестве параметра, чтобы он был создан и выпущен вызывающей стороной?

Я также изменил свой код для вызова CGPathRelease, что немного безопаснее.Любые предложения приветствуются.

1 Ответ

1 голос
/ 12 октября 2011

Политика CoreFoundation заключается в том, что если в функции есть слово «Создать», то функция возвращает владеющий (или сохраняемый) объект, который вызывающий отвечает за освобождение.Таким образом, ваш NewPathWithRoundRect метод должен быть назван CreatePathWithRoundRect, а затем просто удалить отложенный CFRelease.Звонящий будет ответственен за освобождение этого, когда они закончат с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...