Ich bin mir sicher, dass ich ein grundlegendes Verständnis von iOS-Speicherverwaltung vermisse und, trotz viel Lesen und Suchen, bekomme ich es immer noch nicht.iOS Singletons und Speicherverwaltung
Ich verwende ein Singleton in meiner App, das Informationen über den aktuell angemeldeten Benutzer enthält, Informationen, auf die von mehreren View-Controllern zugegriffen wird usw. Es verfügt über mehrere Ivars, die in der gesamten App abgerufen und eingerichtet werden. Sie sind deklariert und in der H-Datei begütert wie so:
NSString *myString;
und bestehen beibehalten wie so:
@property (non atomic, retain) NSString *myString;
und bei der Umsetzung synththesized.
ich und setzen ihre Werte in Methoden in der Singleton wie folgt aus:
myString = @"value";
und
methodLocalString = myString;
In anderen Orten, die ich die Singleton umfassen - es nennen Current - I importiere es:
#import "CurrentUser.h"
Außerhalb des Singleton bekomme ich und legen Sie es wie folgt aus:
[CurrentUser sharedCurrentUser].myString = @"Bob";
und
myOutsideString = [CurrentUser sharedCurrentUser].myString;
das meiste Zeit funktioniert gut, mit den Werten beharrte in geeigneter Weise von einem bekommen oder auf eine andere Einstellung. Das Problem ist, dass manchmal, wenn ich sie auf diese Weise bekomme, ich feststelle, dass sie veröffentlicht wurden (Absturz der App), was mir NSZombieEnabled dankbar erklärt.
Was ich nicht verstehe, ist wie er passieren kann. Ich dachte, dass der Singleton nie veröffentlicht wurde, und dass deshalb beibehaltene Eigenschaften des Singletons nie veröffentlicht würden. Ich stelle fest, dass das Problem eher bei Nicht-Real-Objekt-Eigenschaften wie NSDate und Definitiv-Nicht-Objekt-Eigenschaften wie int und BOOL auftritt, die nicht beibehalten werden können, aber auch bei Objekteigenschaften.
Worüber bin ich hier unwissend? Und danke für deine Geduld.
gute Frage. auf die Klärung warten. – harshalb
Verwenden Sie nicht 'retain' mit' NSString' Eigenschaften. Verwende 'Kopieren'. –
Danke für die nicht auf Kopie. Das sollte für alle Objekte sein, die NSCopying unterstützen, oder? –