[Résolu] - ARC - Manipulation des objets dans un tableau

skimpyskimpy Membre
décembre 2011 modifié dans API AppKit #1
Bonjour,

Je suis en train de lire Objective-C Programming (Big Nerd Ranch) et je me penche sur ARCet je me pose une question concernant la gestion des objets dans un tableau.
J'aimerais simplement déplacer un objet d'un index n à  un index n + x. Dans l'exemple du livre, on voit clairement que lorsque la méthode removeObjectAtIndex est appelée, l'instance est détruite. J'ai fait un test un faisant un remove et un insert juste après, et ça a marché.

Je me demandais si c'était de la pure chance ou si dans mon cas, il aurait mieux fallu créer d'abord une copie de l'objet ? En fait ma question est : avec ARC, faut-il faire une copie de l'objet lorsque l'on souhaite le déplacer d'index n à  un index n + x ?

Merci.

Philippe

Réponses

  • 05:15 modifié #2
    L'objet ne devait pas être totalement détruit, si tu es resté dans le même scope..
    Il n'empêche que sans ARC, tu aurais du faire un -retain sur l'objet par mesure de sécurité.
    <br />id object = [myArray objectAtIndex:i];<br />[object retain];<br />[myArray removeObject:object];<br />[myArray insertObject:object atIndex:i+x-1];<br />[object release];<br />
    


    En fait ARC a été créé à  cause de ce genre de problèmes.. Qui n'en sont pas vraiment si on maà®trise bien la gestion mémoire et que l'on prend un minimum de précautions.
    Avec ARC, le code aurait été la même chose, sans le retain/release.
  • CéroceCéroce Membre, Modérateur
    05:15 modifié #3
    Note bien la distinction:

    -[retain]
    Retenir un objet augmente son retain count de 1, ce qui signifie qu'il devra recevoir un appel de plus à  -[release] pour être désalloué.

    -[copy]
    Copier un objet crée une deuxième instance de la même classe dont les variables d'instance ont la même valeur. Il s'agit d'un autre objet.
    À une exception près: l'implémentation de -[copy] pour certains objets non mutables (NSString, NSValue...) appelle en fait -[retain]. En effet, par définition, leurs variables d'instance n'étant pas modifiables, il ne sert à  rien de dupliquer l'instance.
  • MalaMala Membre, Modérateur
    05:15 modifié #4
    Mmm, par définition "objectAtIndex:" renvoie quel type d'objet déjà ???  ;)

    Donc comme on récupère un objet de type autorelease ça cela marche très bien sans rien ajouter...
    <br />id object = [myArray objectAtIndex:i];<br />[myArray removeObject:object];<br />[myArray insertObject:object atIndex:i+x-1];<br />
    
  • skimpyskimpy Membre
    05:15 modifié #5
    OK, merci pour vos réponses. En fait c'est cette phrase dans le livre qui m'a interpellé :

    When employee #5 is removed from the array, it is deallocated because it has no owner. Then its assets are deallocated because they have no owner. (And you'll have to trust me on this: the labels (instances of NSString) of the deallocated assets are also deallocated once they have no owner.
  • 05:15 modifié #6
    dans 1323421386:

    Mmm, par définition "objectAtIndex:" renvoie quel type d'objet déjà ???  ;)

    Donc comme on récupère un objet de type autorelease ça cela marche très bien sans rien ajouter...
    <br />id object = [myArray objectAtIndex:i];<br />[myArray removeObject:object];<br />[myArray insertObject:object atIndex:i+x-1];<br />
    



    C'est pas faux.
  • FloFlo Membre
    05:15 modifié #7
    Petite question juste comme ça, est-ce que l'utilisation d'ARC est destinée à  devenir obligatoire ou pourra-t-on continuer d'utiliser la bonne vieille gestion mémoire à  la main ?  :P
  • CéroceCéroce Membre, Modérateur
    05:15 modifié #8
  • FloFlo Membre
    05:15 modifié #9
    Ha oui tiens, dsl, je ne l'ai pas vu passer.  >:)

    merci pour le lien.  :D
  • laudemalaudema Membre
    05:15 modifié #10
    Tu as aussi la méthode exchangeObjectAtIndex:withObjectAtIndex:. Elle n'est pas dans "Cocoa Programming" et ne répond pas à  la question telle que tu l'as posée, seulement au titre ;)

    Bon, je sors boire un Perrier Citron ça me rafraichira les idées  >:)
  • DrakenDraken Membre
    05:15 modifié #11
    Good Boy !  :)  :p
Connectez-vous ou Inscrivez-vous pour répondre.