ARC ivar fraco liberado antes de ser devolvido - ao construir para liberação, não depurar
Eu tenho uma classe que cria um objeto preguiçosamente e armazena como uma propriedade fraca. Outras classes podem solicitar este objeto, mas obviamente devem manter uma forte referência a ele para evitar que o objeto seja desalocado:
// .h
@interface ObjectManager
@property(nonatomic, weak, readonly) NSObject *theObject;
@end
// .m
@interface ObjectManager ()
@property(nonatomic, weak, readwrite) NSObject *theObject;
@end
@implementation ObjectManager
- (NSObject *)theObject
{
if (!_theObject) {
_theObject = [[NSObject alloc] init];
// Perform further setup of _theObject...
}
return _theObject;
}
@end
Quando o esquema é definido como Xcode para compilar para Debug, as coisas funcionam bem - um objeto pode chamarobjectManagerInstance.theObject
e voltetheObject
.
Quando o esquema está configurado para construir para Release,theObject
devolvenil
:
// Build for Debug:
NSObject *object = objectManagerInstance.theObject;
// object is now pointing to theObject.
// Build for Release:
NSObject *object = objectManagerInstance.theObject;
// object is now `nil`.
Meu palpite é que o compilador está otimizando meu código, vendo que_theObject
não é mais usado no próprio método do acessador, então a variável fraca está sendo definida comonil
antes de retornar. Parece que eu teria que criar uma referência forte antes de realmente retornar a variável, o que eu só posso pensar em fazer usando um bloco, mas seria confuso e eu prefiro evitá-lo!
Existe algum tipo de palavra-chave que eu possa usar com o tipo de retorno para impedir que o ivar seja tão rápido?