Имам метод, който създава връща инстанция на a CoreGraphics
обект - CGPathRef
.
Когато стартирам приложението чрез 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.
}
Да приемем, че това трябва да е възможно, тъй като много рамки връщат тези обекти, изискващи повикващия да почисти ...
Благодаря предварително !
Послепис Страхувам се, че този въпрос не е дуп, нито пък има правилен отговор никъде другаде ... трите отговора, подчертани в горната част на тази страница, не са правилни / пълни ... само отговора, предоставен от Матиас Баух, т.е. "Правилото е наистина правилният отговор на въпроса, който повдигнах :) БЛАГОДАРЯ!
Отговори:
9 за отговор № 1Функциите на 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
}
0 за отговор № 2
Трябва да можете да направите това:
#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif
Не мога да кажа, че все пак го препоръчвам!