[Résolu] Tableau ou liste de (int)

ancrouancrou Membre
avril 2008 modifié dans API AppKit #1
Bonjour,
Je voudrais stocker dans un tableau, liste ou autre du genre, une collection d'adresse mémoire. Dans un type maison: UI16_
Je pensais à  un NSMutableArray, mais il me demande le pointeur de mon objet !
Mais UI16_ n'est pas un objet, c'est comme un type atomique, comme int ...

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    11:13 modifié #2
    Ben j'aurai tendance à  dire &taVariable non ?
  • ChachaChacha Membre
    11:13 modifié #3
    dans 1208851913:

    Bonjour,
    Je voudrais stocker dans un tableau, liste ou autre du genre, une collection d'adresse mémoire. Dans un type maison: UI16_
    Je pensais à  un NSMutableArray, mais il me demande le pointeur de mon objet !
    Mais UI16_ n'est pas un objet, c'est comme un type atomique, comme int ...

    Tu peux toujours utiliser un tableau C normal (UI16_[], malloc(), free())
    Sinon, tu peux encapsuler tes UI16_ dans des objets comme NSNumber ou plutôt NSValue dans ton cas.

    +
    Chacha
  • ancrouancrou Membre
    11:13 modifié #4
    Merci,
    L'encapsulation serai à  ma solution. Tous simplement :-/
    Sinon, je stock directement les données au lieu de stocker leur adresse  :o

  • ancrouancrou Membre
    11:13 modifié #5
    Bonjour,

    J'ai fait de l'encapsulation dans un NSValue.
    ça compiler, mais à  l'exécution j'ai :
    *** -[NSPlaceholderValue value:withObjCType:]: selector not recognized [self = 0x131c0c0]


    Mon code
    UI16_ marqueur;<br />	NSMutableArray* listLength = [NSMutableArray init];<br />	while(loop&lt;nbrLeads){<br /><br />		//.....<br /><br />		NSValue *taille = [ NSValue value: &amp;marqueur withObjCType: @encode(UI16_)];<br />		[listLength addObject:taille];<br /> 		loop++;<br />	}
    


    Quoi de mal ?
  • ancrouancrou Membre
    11:13 modifié #6
    Il manquait l'allocation du listLength
    :o   :o

    Dire que j'ai passé du temps pour un truc de merde  B)
  • AliGatorAliGator Membre, Modérateur
    11:13 modifié #7
    Mouais en même temps l'erreur au runtime était super explicite... je sais pas où il est allé chercher cette erreur bizarre alors que ça n'avait rien à  voir, il aurait plutôt dû te mettre un warning du genre "NSMutableArray may not respond to init", bizarre.
  • schlumschlum Membre
    11:13 modifié #8
    Ah ben quand t'alloues pas un truc, il prend dans la mémoire au pif, donc on peut avoir tout et n'importe quoi...
  • AliGatorAliGator Membre, Modérateur
    11:13 modifié #9
    A l'exec oui en effet sans doute.
    Mais pourquoi dans ce cas il n'a pas eu de warning à  la compil' pour dire que la classe ne répondait pas à  "init" ?
    A moins qu'il ne l'ait pas vu... (ou ait diminué la verbosité des warnings)
  • Philippe49Philippe49 Membre
    11:13 modifié #10
    Un  essai rigolo :   <3 <3 :brule:<br />

    #import <Foundation/Foundation.h>
    int main(int argc, char**argv){
    NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
    NSLog(@%p,[NSString init]);
    NSLog(@%p,[NSString class] );
    [pool release];
    return 0;
    }


    Resultat:
    % gcc pgm.m -o pgm -framework Cocoa -Wall
    % pgm
    2008-04-23 20:33:57.403 pgm[2358:10b] 0xa0446f00
    2008-04-23 20:33:57.405 pgm[2358:10b] 0xa0446f00
    %


    aucun warning, même avec -Wall
    Pourquoi ? Eh ben, j'en sais rien ...
  • schlumschlum Membre
    avril 2008 modifié #11
    ça me semble logique...
    Quand on fait un appel [NomClass method];, c'est transformé en quelque sorte en [NSClassFromString(@NomClass) method];
    (Bon, c'est pas NSClassFromString mais un appel spécial du runtime, mais c'est l'idée...)
    Or "init" est bien une méthode d'instance de NSClass jusqu'à  preuve du contraire...

    Ne pas oublier que quoi qu'on fasse c'est sur un objet qu'on appelle quelque-chose (de par la définition de "objc_msgSend") ; et comme "init" est une méthode de NSObject.  :P
  • Philippe49Philippe49 Membre
    11:13 modifié #12
    dans 1208991506:

    Or "init" est bien une méthode d'instance de NSClass jusqu'à  preuve du contraire...


    Oui, mais dans l'exemple, on fait l'appel sur la classe : [NSString init]

    Second exemple :
    Là  on a droit à  un Warning (logique) et un bug à  l'exécution (logique).

    #import <Foundation/Foundation.h>
    @interface ClassA:NSObject
    {}
    -(id) instanceMethod;
    @end
    @implementation ClassA
    -(id) instanceMethod{ NSLog(@In instance method);return self;}
    @end

    int main(int argc, char**argv){
    NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];

    NSLog(@%p,[ClassA instanceMethod]);
    NSLog(@%p,[ClassA class] );
    [pool release];
    return 0;
    }


    Le test [ClassA respondsToSelector:@selector(init)] répond YES, ce qui tente à  prouver l'existence d'une méthode non documentée +(id)init sur NSObject
  • schlumschlum Membre
    avril 2008 modifié #13
    dans 1209023005:

    dans 1208991506:

    Or "init" est bien une méthode d'instance de NSClass jusqu'à  preuve du contraire...


    Oui, mais dans l'exemple, on fait l'appel sur la classe : [NSString init]


    Et ? Comme j'ai dit au dessus, NSString est une instance de l'objet Class...

    Le test [ClassA respondsToSelector:@selector(init)] répond YES, ce qui tente à  prouver l'existence d'une méthode non documentée +(id)init sur NSObject


    Mais non, du tout... ça prouve juste que ClassA est en elle-même une instance.
    Si cette soi-disant méthode non documentée existait on la verrait avec class-dump.
  • schlumschlum Membre
    11:13 modifié #14
    Suffit de regarder l'assembleur pour voir ce qui se passe...

    test.m :
    #import &lt;Foundation/Foundation.h&gt;<br />int main(int argc, char**argv)<br />{<br />	id res = [NSString init];<br />	return 0;<br />}
    


    gcc -S -isysroot /Developer/SDKs/MacOSX10.5.sdk test.m
    


    test.s :
    ...<br />L_OBJC_SELECTOR_REFERENCES_0:<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  L_OBJC_METH_VAR_NAME_0<br />&nbsp; &nbsp; &nbsp; &nbsp; .section __OBJC, __image_info, regular, no_dead_strip<br />&nbsp; &nbsp; &nbsp; &nbsp; .align 2<br />L_OBJC_IMAGE_INFO:<br />&nbsp; &nbsp; &nbsp; &nbsp; .space 8<br />&nbsp; &nbsp; &nbsp; &nbsp; .objc_module_info<br />&nbsp; &nbsp; &nbsp; &nbsp; .align 2<br />L_OBJC_MODULES:<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  7<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  16<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  L_OBJC_CLASS_NAME_0<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  L_OBJC_SYMBOLS<br />&nbsp; &nbsp; &nbsp; &nbsp; .lazy_reference .objc_class_name_NSString<br />&nbsp; &nbsp; &nbsp; &nbsp; .objc_cls_refs<br />&nbsp; &nbsp; &nbsp; &nbsp; .align 2<br />L_OBJC_CLASS_REFERENCES_0:<br />&nbsp; &nbsp; &nbsp; &nbsp; .long&nbsp;  L_OBJC_CLASS_NAME_1<br />&nbsp; &nbsp; &nbsp; &nbsp; .objc_class_names<br />L_OBJC_CLASS_NAME_1:<br />&nbsp; &nbsp; &nbsp; &nbsp; .ascii &quot;NSString&#092;0&quot;<br />L_OBJC_CLASS_NAME_0:<br />&nbsp; &nbsp; &nbsp; &nbsp; .ascii &quot;&#092;0&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; .objc_meth_var_names<br />L_OBJC_METH_VAR_NAME_0:<br />&nbsp; &nbsp; &nbsp; &nbsp; .ascii &quot;init&#092;0&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5<br />L_objc_msgSend$stub:<br />&nbsp; &nbsp; &nbsp; &nbsp; .indirect_symbol _objc_msgSend<br />&nbsp; &nbsp; &nbsp; &nbsp; hlt ; hlt ; hlt ; hlt ; hlt<br />&nbsp; &nbsp; &nbsp; &nbsp; .subsections_via_symbols
    
  • Philippe49Philippe49 Membre
    11:13 modifié #15
    Oui , bon , mais quand on m'explique assez longtemps, je finis par avoir des lueurs ...  :o

    Autre essai :
    [ClassA retain];
    if([ClassA respondsToSelector:@selector(retain)]) NSLog(@ClassA responds to retain method);
    Ok, Ca marche

    retain est une méthode de NSObject,
    L'objet (de classe) ClassA est (sans doute) un NSObject
    Donc ClassA répond à  retain ...  :)   

    Bon étant épuisé, je retourne prendre un café ...
  • schlumschlum Membre
    avril 2008 modifié #16
    Avec retainCount, résultat exotique : -1  ;)

    #import &lt;Foundation/Foundation.h&gt;<br />int main(int argc, char**argv)<br />{<br />	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];<br />	NSLog(@&quot;%d&quot;,[NSString retainCount]);<br />	[pool release];<br />	return 0;<br />}
    



    Quant à  "NSLog(NSStringFromClass([NSString superclass]));", ça retourne "NSObject"  :P
  • schlumschlum Membre
    avril 2008 modifié #17
    L'appel à  "dealloc" fait mal  :o

    2008-04-24 10:13:05.461 testExe[11973:10b] *** Terminating app due to uncaught exception &#39;NSInvalidArgumentException&#39;, reason: &#39;*** +[NSString&lt;0xa0886f00&gt; dealloc]: cannot dealloc a class object&#39;<br />2008-04-24 10:13:05.484 testExe[11973:10b] Stack: (<br />    2447635019,<br />    2504765691,<br />    2447662964<br />)<br />[1]    11973 trace trap  ./testExe
    



    Dans les autres trucs amusants :
    NSLog(@&quot;%u&quot;,[NSString hash]);<br />NSLog(@&quot;%u&quot;,[NSString isEqual:[NSString class]]);<br />Class Test = [NSString mutableCopy];<br />NSLog(@&quot;%@&quot;,[Test className]);
    
  • AliGatorAliGator Membre, Modérateur
    11:13 modifié #18
    dans 1209024501:

    Avec retainCount, résultat exotique : -1  ;)
    Pas tant que ça, on a un retainCount à  MAX_INT (évalué à  -1 si interprété comme signed au lieu d'unsigned) pour les objets statiques ou les literals par exemple. Et je pense que c'est lié.

    Sinon je sais pas si c'est une bonne chose que de faire ces tests/essais avec NSString, vu que c'est une Class Cluster, donc ça peut fausser les résultats, surtout pour des tests aussi exotiques que ceux-là  (à  savoir du code qui n'est pas sensé être bon déjà  à  la base)
  • schlumschlum Membre
    11:13 modifié #19
    À part pour "hash", n'importe quelle autre classe donne les mêmes résultats...
  • Philippe49Philippe49 Membre
    avril 2008 modifié #20
    dans 1209026777:

    Sinon je sais pas si c'est une bonne chose que de faire ces tests/essais avec NSString, vu que c'est une Class Cluster, donc ça peut fausser les résultats, surtout pour des tests aussi exotiques que ceux-là  (à  savoir du code qui n'est pas sensé être bon déjà  à  la base)

    C'est idem sur ClassA

    Autre résultat amusant : Avec une boucle pour dépasser NSUIntegerMax, il n'y a pas déallocation lors du passage du retainCount à  0 ... La boucle ci-dessous est vraiment non finie


    #import <Foundation/Foundation.h>
    @interface ClassA:NSObject
    {}

    @end
    @implementation ClassA
    -(void) dealloc {NSLog(@Deallocing);[super dealloc];}
    @end

    int main(int argc, char**argv){
    NSAutoreleasePool * pool=[[NSAutoreleasePool alloc] init];
    ClassA * obj=[[ClassA alloc] init];
    NSUInteger r=0;
    for(r=0;obj!=nil;r++) {if(r%100000000==0) printf("%u\n",r);[obj retain];}
    [pool release];
    return 0;
    }


  • schlumschlum Membre
    11:13 modifié #21
    Oui, c'est comme pour le retainCount ; "retain" et "release" n'ont aucun effet ; ils doivent être ignorés.
  • AliGatorAliGator Membre, Modérateur
    11:13 modifié #22
    Bon désolé c'est la mode je déterre un vieux post, mais il ce post est ressorti en faisant une recherche du coup je l'ai reparcourru et j'ai quelques apports aujourd'hui :P
    dans 1209027583:

    Autre résultat amusant : Avec une boucle pour dépasser NSUIntegerMax, il n'y a pas déallocation lors du passage du retainCount à  0 ... La boucle ci-dessous est vraiment non finie
    Normal : ce n'est que lors d'un appel à  [tt]release[/tt] donc quand il décrémente le retainCount qu'il vérifie si ce dernier ne tombe pas à  zéro. Lors des retain, il se contente d'incrémenter le retainCount mais ne vérifie pas s'il vaut zéro, puisqu'en théorie ça n'a pas de sens que ça arrive... à  part dépassement de capacité comme tu le fais dans ton exemple, mais qui n'est pas un comportement normal attendu non plus :P

    Sinon en relisant on disait aussi que les objets Class (comme [NSString class] qui renvoie une classe, ou plutôt un "objet de type Class, sorte de méta-objet) dérivent en fait de NSObject et c'est pourquoi elle savent répondre à  init et toutes les autres méthodes de NSObject... Mais en fait je trouve pas très logique que ces classes Class dérivent de NSObject... que NSString dérive de NSObject, ok, mais que [NSString class], notre méta-objet de type Class, dérive aussi de NSObject, c'est moins logique je trouve... Enfin y'a de quoi s'embrouiller là  dedans :D
Connectez-vous ou Inscrivez-vous pour répondre.