отключить предупреждение компилятора об освобождении объекта CGMutablePathRef - PullRequest
4 голосов
/ 22 марта 2012

Я включил статический анализатор, но он говорит мне, что в конце этого пути выполнения этот объект не был освобожден, что может вызвать утечку памяти.Однако я передаю эту ссылку на созданный объект другому классу, который его освободит.Мне было интересно, если есть метод или ключевое слово, чтобы сказать скомпилированному, что я выпущу этот объект позже.

Я ищу что-то вроде автоматического выпуска.

Кстати, яЯ использую ARC.

Я создаю объект следующим образом:

CGMutablePathRef pathRef = CGPathCreateMutable();

И передаю его так:

self.flowView.pathToDraw = pathRef;

В моем классе FlowView у меня есть этот метод, которыйвыпустит его.

-(void) setPathToDraw:(CGMutablePathRef) newPath {
    if(pathToDraw!=NULL) CGPathRelease(pathToDraw);
    pathToDraw=newPath;
    [self setNeedsDisplay];
}

Я уже пытался просмотреть документацию GCPath, но мне не повезло.

Спасибо

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Да, для этого есть расширение:

http://clang.llvm.org/docs/LanguageExtensions.html#objc_features

Вы можете объявить свой метод как:

- (void)setPathToDraw:(CGMutablePathRef) __attribute__((cf_consumed)) newPath

и затем Clang распознает это (с места вызова - он не может проверить, действительно ли вы используете его в определении).

Вы должны убедиться, что каждый селектор, который определяет это, соответствует атрибуту, который вы применили для селектора (имя).

Атрибуты рискованны - я рекомендую придерживаться соглашений, где это возможно, и быть особенно осторожным при работе с динамической диспетчеризацией. Вот пример использования ARC, где компилятор может ошибиться . Если компилятор ошибается, шансы у вас тоже хорошие, потому что вы работаете с инструментами, которые пытаются вам помочь.

IIRC, consume - единственный атрибут, который я использовал, и я использую его исключительно для статической отправки.

1 голос
/ 22 марта 2012

Почему бы вам просто не следовать обычному соглашению о сохранении / выпуске?Я не понимаю, что вы надеетесь получить.

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

CGMutablePathRef pathRef = CGPathCreateMutable();
self.flowView.pathToDraw = pathRef;
CGPathRelease(pathRef);

-(void) setPathToDraw:(CGMutablePathRef) newPath
{
    if (pathToDraw != newPath) {
        CGPathRelease(pathToDraw);
        pathToDraw=CGPathRetain(newPath);

        [self setNeedsDisplay];
    }
}

Если вы настаиваете на этом странным образом, другой альтернативой является использование атрибута cf_consumed в вашем объявлении .Это объясняет анализатору, что вы делаете что-то необычное.

...