2017-08-31 2 views
0

Désolé, j'ai une question à propos de la gestion de la mémoire.
Je crée un objet "utilisateur".
Et quand je finis d'utiliser, je veux le rendre nul pour louer de la mémoire.
Je l'essaie mais j'échoue.
Qu'est-ce qui ne va pas chez moi?
Comment définir un objet de classe dans swift?

var user:User? = User(userId) 
user?.fromJson(data["user"]) 
self.users[userId] = user 
user?.updateDb() 
user = nil 
+0

que signifient "I fail"? obtenez-vous une erreur de compilation ou quoi? Btw. vous ne devriez pas avoir à vous soucier de la gestion de la mémoire dans swift, cette langue a un garbage collector, qui libérera de la mémoire si un objet n'est plus accessible par votre code. vérifiez ceci: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html – JohnnyAW

+0

@JohnnyAW Garbage Collection et ARC sont deux concepts complètement séparés. –

+2

Vous avez mis votre 'User' dans le tableau' self.users'; il y a donc une référence à cela et elle ne sera pas publiée avant que cette référence ne disparaisse. – Paulw11

Répondre

0

Pour la plupart, vous n'avez pas à vous soucier de deinitializing un objet. Swift, comme son prédécesseur Objective-C, utilise le comptage automatique des références (ARC, Automatic Reference Counting) pour garder trace des objets qui sont toujours utilisés et qui doivent être supprimés. En bref, s'il n'y a pas de référence forte à un objet, il sera automatiquement désalloué.

Dans votre cas, vous avez défini la variable locale user. Si vous ne stockez pas de référence à cette variable ailleurs, elle sera désaffectée immédiatement après avoir quitté la portée dans laquelle elle a été déclarée.

+0

Je suis juste curieux, comment est-ce un "concept complètement séparé" à la collecte des ordures? – JohnnyAW

+0

@JohnnyAW [ARC vs GC] (https://docs.elementscompiler.com/Concepts/ARCvsGC/) – ColGraff

+0

@ColGraff thx pour le lien, mais cela montre réellement, que ce sont 2 implémentations différentes pour le même «concept» de la gestion de la mémoire – JohnnyAW

1

Si "Utilisateur" est Référence Type

Lorsque vous créez referenceCount objet incrémentée sur 1

lorsque vous définissez l'utilisateur dans le dictionnaire par "userId" referenceCount incrémentée sur 1

et referenceCount == 2

après que l'utilisateur = nul, vous supprimez 1 référence

referenceCount == 1

et rester 1 référence forte, l'objet n'est pas supprimé

+0

comment vérifier le compte de référence –

+0

La base de base a C Fonction qui retourne refCount "CFGetRetainCount (_ cf: CFTypeRef!) -> CFIndex" CFindex est typealias sur Int –