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?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage