15Close17
BrunniOn the 2013-05-22 at 09:27am
Kevin Kofler (./12) :
Et pourquoi pas utiliser la solution de Qt (pour les objets de données), à savoir le comptage de références implicit? Ça évite de devoir appeler retain et release tout le temps et ça contourne entièrement la problématique d'autorelease. (Et d'ailleurs, l'implémentation de Qt est aussi thread-safe.)

Je me rappelle que c'était très bien fichu à ce niveau-là quand je m'étais amusé avec Qt à l'époque, mais mes souvenirs sont vagues. C'était pour les trucs de données seulement non ? (avec le copy-on-write tout ça)
Tu as un exemple d'objet simple créé soi-même avec la possibilité d'en passer des références à gauche et à droite ? smile

./6> En fait je pense que la meilleure façon si tu ne veux pas de "pool", ce serait de ne jamais retourner une référence vers un objet, ou que si tu le fais c'est qu'elle t'appartient encore juste à la sortie (plus tard on ne sait pas, d'où l'intérêt de l'appelant de faire un retain s'il compte le garder).
Typiquement on pourrait tout à fait imaginer qu'une méthode retourne une référence vers l'objet lui-même (return this) ou une référence vers un objet qu'elle possède, mais PAS retourner un objet nouvellement créé et qui ne sert qu'à l'appelant. Dans ce cas-là il faudrait passer un pointeur en argument.
class Number: public Object {
    private int nb;
public:
    Number() : nb(0) {}
    Number *setValue(int val) {
        nb = val;
        return this;
    }
};

Tandis que:
void createNumber(Number **dest, int value) {
    /* Devra être libéré par l'appelant */
    *dest = new Number()->setValue(value);
}

Je ne me suis pas encore bien décidé si je préfère ça ou utiliser un truc genre shared_ptr (boost). L'avantage de cette méthode c'est quand même la transparence (hormis pour les deux primitives), tu utilises ton propre objet partout.