Comment détruire spécifiquement une instance de NSObject
Pyroh
Membre
La question est dans le titre, j'ai besoin de savoir comment détruire une instance de NSObject
et dé-allouer la mémoire qu'il occupait.
Je suis au courant que ça tout faire planter, l'idée c'est de savoir ce qui va planter 😉
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Déjà, avec ARC, on ne peut plus appeler
-release
. Mais si tu le désactives, tu peux essayer, si ça suffit pour ton expérimentation.En ObjC, l'allocation des objets se fait toujours sur le tas (heap), aussi on peut peut-être simplement appeler
free(monObjet)
.Merci de l'idée mais ça ne peut pas s'appliquer dans mon cas.
Je vais donner plus d'infos pour que vous ayez une meilleure image du soucis, ce que j'aurai du faire dès le début en fait...
J'ai des sous-classes de
NSView
que j'utilise dans SwiftUI via le protocolNSViewRepresentable
. On est sur Mac. Et certaines de ces instances ne sont jamais dé-allouées et s'entassent dans un coin de la mémoire. D'après Internet ça serait le fait d'avoir des@State
et@Binding
dans cesNSView
, ce qui est le cas pour les vues problématiques mais d'autres dans le même cas n'ont pas de soucis pour être purgées correctement.Ce qui fait que je ne peux pas désactiver ARC et je ne peux pas appeler
free
parce que là où j'ai accès à l'instanceself
est immutable.Je pensais plus à des incantations liées au runtime Obj-C initialement. J'arrive bien à péter des trucs avec le runtime d'habitude...
A la rigueur, tu peux compter compter le nombre de retain et essayer de détruire la vue qui réduira le compteur
Exemple
print(CFGetRetainCount(mavue))
Je sais pas si ca peux aider.....
Tu le tiens dans un var strong, weak ou unowned ?
C'est pas moi qui le tien c'est bien ça le soucis 😧
Non là il me faut vraiment une méthode pour faire ça salement quitte à corrompre la mémoire du processus. Ça doit planter, je veux savoir où et par quel objet. Pour savoir si c'est de ma faute ou celle de SwiftUI.
Bon j'ai pas trouvé comment détruire précisément une instance mais j'ai trouvé comment réduire son retain count à 0. Ce qui revient au même dans mon cas. Au final ça ne m'apprend rien sur le pourquoi du comment mais au moins j'aurai appris ça. Pour info ça plante une autorelease pool.
Bref il faut utiliser
Unmanaged
de la sorte: