ARC-Schwach-IVAR wird veröffentlicht, bevor es zurückgegeben wird - beim Erstellen für die Veröffentlichung, nicht beim Debuggen
Ich habe eine Klasse, die ein Objekt träge erstellt und als schwache Eigenschaft speichert. Andere Klassen fordern dieses Objekt möglicherweise an, müssen jedoch offensichtlich einen starken Verweis darauf halten, um zu verhindern, dass die Zuordnung des Objekts aufgehoben wird:
// .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
Wenn das Schema so eingestellt ist, dass Xcode für Debug erstellt wird, funktionieren die Dinge einwandfrei - ein Objekt kann aufrufenobjectManagerInstance.theObject
und komm zurücktheObject
.
Wenn das Schema für die Freigabe erstellt werden soll,theObject
kehrt zurücknil
:
// Build for Debug:
NSObject *object = objectManagerInstance.theObject;
// object is now pointing to theObject.
// Build for Release:
NSObject *object = objectManagerInstance.theObject;
// object is now `nil`.
Ich vermute, dass der Compiler meinen Code optimiert, indem er das sieht_theObject
wird in der Zugriffsmethode selbst nicht weiter verwendet, daher wird die schwache Variable auf gesetztnil
Vor der Rückkehr. Es scheint, dass ich eine starke Referenz erstellen müsste, bevor ich die Variable tatsächlich zurückgebe, was ich nur mit einem Block tun kann, aber es wäre chaotisch und ich würde es lieber vermeiden!
Gibt es eine Art von Schlüsselwort, das ich mit dem Rückgabetyp verwenden kann, um zu verhindern, dass der Ivar so schnell gelöscht wird?