Подавить анализатор XCode Возможная утечка объекта, хранящегося в .. error

У меня есть метод, который создает экземпляр объекта CoreGraphicsCGPathRef.

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

Что я могу сделать, чтобы подавить это предупреждение Analyzer?

- (CGPathRef) createSomePath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle
{
  CGMutablePathRef slicePath = CGPathCreateMutable();

  ....

  return slicePath;  <--- Analyzer points to this line as a potential leak.
}

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

Заранее спасибо !

P.S. Боюсь, что этот вопрос не является обманом и не имеет правильного ответа где-либо еще ... 3 ответа, выделенные вверху этой страницы, не являются правильными / полными ... только ответ, предоставленный здесь Матиасом Баухом, т. Е. «Новый "правило действительно правильный ответ на вопрос, который я поднял :) СПАСИБО!


person Moonwalker    schedule 25.06.2013    source источник
comment
Я сделал это некоторое время назад ;-)   -  person Matthias Bauch    schedule 25.06.2013
comment
@moonwalker Это не волшебство; Create — номенклатура CF*. +new — это номенклатура Objective-c. +create ничего не значит в Objective-C.   -  person bbum    schedule 26.06.2013
comment
@bbum - конечно, я понимаю, что это правило создания - магия - это просто фигура речи .. :)   -  person Moonwalker    schedule 26.06.2013


Ответы (2)


Функции CoreFoundation следуют "создать правило". Если в функции есть «Создать», она возвращает объект со счетчиком ссылок, равным 1.

К сожалению, ваш метод не является функцией c.

Поэтому вы должны превратить свой метод Objective-C в функцию C. Что-то вроде этого:

CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) {
    // your code here
}

Это должно понравиться анализатору и корректно работать с ARC.

В методе Objective-C вы можете получить аналогичное поведение, начав сигнатуру метода с new, alloc, copy или mutableCopy. Запуск метода с new, вероятно, лучше всего подходит для вашего случая.
Что-то вроде этого должно понравиться анализатору, но я не уверен, что это правильно работает с ARC. Вы должны профилировать это.

- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
    // your code here
}
person Matthias Bauch    schedule 25.06.2013
comment
Отлично - newPath работал для Analyzer. Предположим, что у ARC не будет проблем с этим, но он будет следить за этим... Спасибо, Мэтт. Принять этот ответ - person Moonwalker; 25.06.2013

Вы должны быть в состоянии сделать это:

#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif

Хотя не могу сказать, что рекомендую!

person woz    schedule 25.06.2013
comment
Это не сработало? Я только что проверил это на себе, и это работает для меня. - person woz; 25.06.2013
comment
Ой, извини! Я не был уверен, кто это был. Это только при запуске Product › Analyze? - person woz; 25.06.2013
comment
да... и если вы поместите #ifndef вокруг назначения CGMutablePathRef slicePath = CGPathCreateMutable(); вместо возврата он действительно работает ... Я уже проголосовал за форму ответа от -1 до 0 ... :) - person Moonwalker; 25.06.2013
comment
Ой ну спасибо! Я отредактировал свой ответ; это похоже на то, что работает для вас? Это также работает для меня, когда я делаю это таким образом. - person woz; 25.06.2013
comment
да... он подавляет предупреждение с исправлением... однако я не понимаю недостатков использования этого подхода... не могли бы вы поделиться своими мыслями? - person Moonwalker; 25.06.2013
comment
Если вы работаете с другими разработчиками, они могут не ожидать, что им придется управлять памятью всякий раз, когда они вызывают ваш метод. Возможной альтернативой является передача CGRefPath по ссылке. - person woz; 25.06.2013