[RESOLU] NSIndexPath de longueur nulle ?

Philippe49Philippe49 Membre
mars 2008 modifié dans API AppKit #1
Je n'ai pas trouvé dans la doc NSIndexPath de communication sur ce que l'on obtient avec :
NSIndexPath * iP2=[NSIndexPath indexPathWithIndex:1];
NSIndexPath * iP3=[iP2 indexPathByRemovingLastIndex];
C'est-à -dire lorsque l'on prend un chemin de longueur 1 dont on supprime le dernier élément.

[size=12pt]Essai[/size]
#include &lt;Foundation/Foundation.h&gt;<br /><br />int main(int argc, char**argv){<br />	NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];<br />	NSIndexPath * iP1=[NSIndexPath indexPathWithIndexes:NULL length:0];<br />	NSLog(@&quot;%@&quot;,iP1); <br />	NSIndexPath * iP2=[NSIndexPath indexPathWithIndex:1];<br />	NSIndexPath * iP3=[iP2 indexPathByRemovingLastIndex];<br />	NSLog(@&quot;%@&quot;,iP2); <br />	NSLog(@&quot;%@&quot;,iP3); <br />	NSIndexPath * iP4=[iP3 indexPathByRemovingLastIndex];<br />	NSLog(@&quot;%@&quot;,iP4); <br />	[pool release];<br />	return 0;<br />}



[size=12pt]Execution[/size]
% gcc pgm.m -o pgm -framework Foundation
% pgm
2008-03-13 06:02:59.917 pgm[306:10b] <NSIndexPath 0x104c00> 0 indexes []
2008-03-13 06:02:59.919 pgm[306:10b] <NSIndexPath 0x105070> 1 indexes [1]
2008-03-13 06:02:59.919 pgm[306:10b] <NSIndexPath 0x104c00> 0 indexes []
2008-03-13 06:02:59.920 pgm[306:10b] <NSIndexPath 0x104c00> 0 indexes []



[size=12pt]Conclusion : [/size]
il semble que le résultat soit un indexPath spécial, de longueur nulle, qui reste invariant lorsqu'on lui retire des indices.

[size=12pt]The Question[/size]
Quelqu'un a-t-il des sources documentaires confirmant ceci ?

Réponses

  • schlumschlum Membre
    18:03 modifié #2
    Ben, ça me semble logique, non ?  :P
  • Philippe49Philippe49 Membre
    18:03 modifié #3
    Oui logique, on aurait pu aussi s'attendre à  nil.
    Le comportement que j'ai observé me va tout à  fait, mais ce qui me gêne c'est qu'Apple ne précise pas la règle du jeu.
  • AliGatorAliGator Membre, Modérateur
    18:03 modifié #4
    C'est pas faux, en même temps c'est le même comportement que toutes les classes de type collection (NSArray & co).
    Si tu prends un NSArray et que tu le vides, ça va te renvoyer un NSArray vide, pas nil.
    C'est bien deux choses différentes que d'avoir un objet vide ou de ne pas avoir d'objet du tout.

    Donc somme toutes c'est logique et c'est surtout que si ça retournais nil j'aurais plutôt assimilé ça à  un bug.
  • Philippe49Philippe49 Membre
    mars 2008 modifié #5
    Ok, merci de vos confirmations. 
    Je voyais bien un non-dit dans tout cela, et effectivement l'exemple des collections NSArray, .. est sans doute le modèle sur lequel on peut se fier.  

    Après d'autres essais, NSIndexPath est basé sur un tableau de type C
       NSUInteger * _indexes
    et quand on vide, l'indexPath de longueur nulle attribue NULL pour ce pointeur. Ceci n'empêche nullement l'enveloppe (l'objet NSIndexPath) de pointer sur un NSIndexPath bien réel.


  • AliGatorAliGator Membre, Modérateur
    18:03 modifié #6
    Oui puisque de toute façon il est dit dans la doc de NSIndexPath que les instances sont uniques.
    NSIndexPath objects are uniqued and shared. If an index path containing the specified index or indexes already exists, that object is returned instead of a new instance.
    Donc il existe un NSIndexPath vide, singleton renvoyé dans tous les cas où le tableau est NULL ;)
Connectez-vous ou Inscrivez-vous pour répondre.