atribuir propriedades, objetos ARC e Core Foundation
Graças aKen isso está funcionando agora. E eu até acho que entendo porque :-)
Aqui está a linha alterada:
- (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!! :-)
}
Editar.Eu ainda não entendi. Eu tentei a sugestão de Chuck:
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
Igual a:
@interface TopLeftSlidingView ()
@property (nonatomic, strong) __attribute__((NSObject)) CGPathRef path ;
@end
E no ponto em que eu recriar o 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 ;
}
Qualquer uma das três linhas comentadas resulta em um erro do compilador. A linha não comentada compila, mas gera um aviso de analisador:
/Users/verec/Projects/WordGame/WordGame/classes/TopLeftSlidingView.mm:211:26:
Call to function 'CGPathCreateMutable' returns a Core Foundation object with
a +1 retain count
Seguido por:
/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
Eu só não entendi :(
Considerar:
@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
Isso tudo compila (e aparentemente executa), exceto que o analisador mantém relatórios de avisos.
Em essência, o que este código está dizendo é: "Por favor ARC, não se incomode em fazer nada comcolor
, por favor, trate da maneira que você trataria qualquer outraassign
propriedade, seja um BOOL ou CGFloat, estou lidando com gerenciamento de memória por conta própria! "
Exceto que ARC se recusa a me ouvir e ainda reclama!
Eu li muitas perguntas aqui no SO, mas nenhuma delas parece resolver esse problema ...
A principal coisa aqui, e o compilador (embora não o analisador) parece concordar, é que declarando a propriedade `assign 'eu reivindiquei lidar com tudo sozinha ...
Então eu devo estar errado, mas eu não vejo porque ...
O que há de errado?