ARC слабый ивар выпущен до возвращения - при сборке для выпуска, не отладки
У меня есть класс, который лениво создает объект и сохраняет его как слабое свойство. Другие классы могут запрашивать этот объект, но, очевидно, должны сохранять строгую ссылку на него, чтобы предотвратить освобождение объекта:
// .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
Когда схема Xcode настроена на сборку для отладки, все работает отлично - объект может вызватьobjectManagerInstance.theObject
и вернутьсяtheObject
.
Когда схема настроена на сборку для Release,theObject
возвращаетсяnil
:
// Build for Debug:
NSObject *object = objectManagerInstance.theObject;
// object is now pointing to theObject.
// Build for Release:
NSObject *object = objectManagerInstance.theObject;
// object is now `nil`.
Я предполагаю, что компилятор оптимизирует мой код, видя, что_theObject
далее не используется в самом методе доступа, поэтому для слабой переменной задано значениеnil
перед возвращением. Кажется, мне нужно создать сильную ссылку, прежде чем на самом деле вернуть переменную, что я могу только сделать, используя блок, но было бы грязно, и я бы предпочел этого избежать!
Есть ли какое-то ключевое слово, которое я могу использовать с типом возврата, чтобы предотвратить обнуление ивара в ближайшее время?