Comment détruire spécifiquement une instance de NSObject

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 😉

Réponses

  • CéroceCéroce Membre, Modérateur

    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).

  • @Céroce a dit :
    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 protocol NSViewRepresentable. 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 ces NSView, 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'instance self 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))

        mavue = nil
    
        print(CFGetRetainCount(mavue))
    

    Je sais pas si ca peux aider.....

  • Joanna CarterJoanna Carter Membre, Modérateur
    avril 2022 modifié #5

    Tu le tiens dans un var strong, weak ou unowned ?

  • @Joanna Carter a dit :
    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:

    func destroy(_ o: AnyObject) {
        stride(to: _getRetainCount(o)).forEach { _ in
            Unmanaged.passUnretained(o).release()
        }
    }
    
Connectez-vous ou Inscrivez-vous pour répondre.