Je suis certain que je manque une compréhension fondamentale de la gestion de la mémoire iOS et, malgré beaucoup de lecture et de recherche, je ne comprends toujours pas. J'utilise un singleton dans mon application qui contient des informations sur l'utilisateur actuellement connecté, des informations provenant de plusieurs contrôleurs de vue, etc. Il dispose de plusieurs ivars qui sont obtenus et définis dans l'application. Ils sont déclarés et possédantes dans le fichier .h comme ceci:iOS Singletons et la gestion de la mémoire
NSString *myString;
et sont faits retenus comme ceci:
@property (non atomic, retain) NSString *myString;
et synththesized dans la mise en œuvre.
je reçois et définir leurs valeurs dans les méthodes dans le singleton comme ceci:
myString = @"value";
et
methodLocalString = myString;
Dans d'autres endroits, j'inclure le singleton - appelle CurrentUser - I l'importer:
#import "CurrentUser.h"
En dehors du singleton je reçois et définir comme ceci:
[CurrentUser sharedCurrentUser].myString = @"Bob";
et
myOutsideString = [CurrentUser sharedCurrentUser].myString;
La plupart du temps, cela fonctionne très bien, avec les valeurs d'une façon appropriée persistait à obtenir ou à la mise à l'autre. Le problème est que parfois quand je les obtiens de cette façon, je trouve qu'ils ont été libérés (écrasement de l'application), ce que NSZombieEnabled me dit heureusement.
Ce que je ne comprends pas, c'est comment ça peut arriver. Je pensais que le singleton n'était jamais sorti, et que par conséquent les propriétés conservées du singleton ne seraient jamais libérées. Je noterai que le problème semble être plus commun avec des propriétés d'objet non-réel comme des propriétés NSDate et certainement-not-object comme int et BOOL qui ne peuvent pas être conservées, mais cela arrive aussi avec des propriétés d'objet.
Qu'est-ce que j'ignore ici? Et merci pour votre patience.
bonne question. en attente de la clarification. – harshalb
N'utilisez pas les propriétés 'retain' avec' NSString'. Utilisez 'copy'. –
Merci pour le pas sur la copie. Cela devrait être pour tous les objets qui supportent NSCopying, non? –