Mam metodę, która tworzy zwraca wystąpienie CoreGraphics
obiekt - CGPathRef
.
Kiedy uruchamiam aplikację przez Analyzer, narzeka, że ta metoda przecieka ... tak, ale jest to zamierzone. Chcę przenieść własność na dzwoniącego i pozwolić mu posprzątać.
Co mogę zrobić, aby to stłumić Analizator ostrzeżenie?
- (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.
}
Załóżmy, że powinno to być możliwe, ponieważ wiele frameworków zwraca te obiekty, które wymagają od wywołującego oczyszczenia ...
Z góry dziękuję !
P.S.Obawiam się, że to pytanie nie jest dupkiem ani nigdzie indziej nie ma właściwej odpowiedzi ... 3 odpowiedzi podświetlone na górze tej strony nie są poprawne / kompletne ... tylko odpowiedź podana tutaj przez Matthiasa Baucha, tj. "Nowa „reguła jest naprawdę właściwą odpowiedzią na zadane przeze mnie pytanie :) DZIĘKI!
Odpowiedzi:
9 dla odpowiedzi № 1Funkcje CoreFoundation są zgodne z "Stwórz zasadę". Jeśli funkcja zawiera „Utwórz”, zwraca obiekt z liczbą odwołań równą 1.
Niestety twoja metoda nie jest funkcją c.
Więc powinieneś zmienić swoją metodę Objective-C w funkcję C. Coś takiego:
CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) {
// your code here
}
Powinno to zadowolić analizator i działać poprawnie z ARC.
W metodzie Objective-C można uzyskać podobne zachowanie, uruchamiając sygnaturę metody za pomocą new
, alloc
, copy
lub mutableCopy
. Rozpoczynanie metody od new
prawdopodobnie najlepiej pasuje do Twojego przypadku.
Coś takiego powinno zadowolić analizator, ale nie jestem pewien, czy działa poprawnie z ARC. Musisz to profilować.
- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
// your code here
}
0 dla odpowiedzi nr 2
Powinieneś być w stanie to zrobić:
#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif
Nie mogę powiedzieć, że polecam to!