przypisz właściwości, obiekty ARC i Core Foundation
DziękiRozpoznać to teraz działa. I nawet myślę, że rozumiem dlaczego :-)
Oto zmieniona linia:
- (void) reCreatePath {
CGMutablePathRef p = ::CGPathCreateMutable() ;
::CGPathMoveToPoint (p, 0, TL.x, TL.y) ;
// [snip]
::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ;
::CGPathCloseSubpath(p) ;
self.path = p ;
::CGPathRelease(p) ; // <<== THIS IS IT!! :-)
}
Edytować.Nadal tego nie rozumiem. Próbowałem sugestii Chucka:
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
Tak jak:
@interface TopLeftSlidingView ()
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
@end
W momencie, w którym odtwarzam CGPath:
- (void) reCreatePath {
CGMutablePathRef p = ::CGPathCreateMutable() ;
::CGPathMoveToPoint (p, 0, TL.x, TL.y) ;
// [snip]
::CGPathAddLineToPoint (p, 0, BL.x, BL.y) ;
::CGPathCloseSubpath(p) ;
// self.path = (__bridge CGMutablePathRef) p ;
// self.path = (__bridge_transfer CGMutablePathRef) p ;
// self.path = (__bridge_retained CGMutablePathRef) p ;
self.path = p ;
}
Każda z trzech skomentowanych linii powoduje błąd kompilatora. Linia bez komentarza się kompiluje, ale generuje ostrzeżenie o analizatorze:
/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:211:26:
Call to function 'CGPathCreateMutable' returns a Core Foundation object with
a +1 retain count
śledzony przez:
/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:225:5:
Object leaked: object allocated and stored into 'p' is not referenced later
in this execution path and has a retain count of +1
Ja tego po prostu nie rozumiem :(
Rozważać:
@interface Test : NSObject
@property (nonatomic, assign) CGColorRef color ;
@end
@implementation Test
- (void) dealloc {
if (self.color) {
::CGColorRelease(self.color) ;
self.color = 0 ;
}
}
- (id) init {
if (self = [super init]) {
self.color = ::CGColorRetain([UIColor blueColor].CGColor) ;
}
return self ;
}
@end
To wszystko kompiluje się (i wygląda na to, że działa) w porządku, z wyjątkiem tego, że analizator nadal wysyła ostrzeżenia.
W istocie to, co mówi ten kod, brzmi: „Proszę ARC, nie przejmuj się niczymcolor
, traktuj to tak, jak traktujesz inneassign
własności, czy to BOOL, czy CGFloat, zarządzam zarządzaniem pamięcią we własnym zakresie! "
Tyle że ARC nie chce mnie słuchać i wciąż narzeka!
Przeczytałem wiele pytań tutaj na temat SO, ale żaden z nich nie wydaje się rozwiązywać tego problemu ...
Kluczową rzeczą tutaj i kompilatorem (choć nie analizatorem) wydaje się być zgodna, czy przez zadeklarowanie właściwości `assign 'twierdziłem, że wszystko załatwię samodzielnie ...
Więc muszę się mylić, ale po prostu nie rozumiem dlaczego ...
Co jest nie tak?