BUG NSArray NSDico

23:33 modifié dans Vos applications #1
Va savoir pourquoi !?
L'application bug...
NSDictionary	*otherDictionary;<br />	/*juste ici<br />	otherDictionary = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[loginField stringValue], [passField stringValue]] forKeys:[NSArray arrayWithObjects:@&quot;Login&quot;, @&quot;Mot de passe&quot;]];<br />*/<br />


L'application quitte inopinément et le log n'indique rien de spécial (à  part le plantage)

Réponses

  • fouffouf Membre
    23:33 modifié #2
    Ah non mais c'est pas vrai. Il faut que tu mettes un ,nil à  la fin de ta liste d'objets. Sinon, c'est bon.
  • 23:33 modifié #3
    :o :o :o :o :o
    JETTEZ MOI DES TOMATES
    à  chaque fois je l'oublie ! je le sais mais ce pu*tain de nil m'*mmer*e
    :p :p
  • ObiObi Membre
    23:33 modifié #4
    Ca m'arrive à  chaque fois, moi aussi  ;D
    Ca sert à  quoi ce nil, au fait ? ???
  • avril 2005 modifié #5
    Simplement à  lui indiquer la fin du tableau. Jusqu'où (combien d'octets il doit lire, il commence à  l'adresse du tableau jusqu'au premier nil ou NULL).

    C'est comme une chaine de type "char" en C.

    Tu peux "t'amuser" à  créer un tableau de 3 items, l'afficher, placer un nil à  l'item du milieu puis le réafficher, le dernier item sera toujours ok mais seulement le premier s'affichera.
  • ClicCoolClicCool Membre
    23:33 modifié #6
    dans 1114255196:

    Tu peux "t'amuser" à  créer un tableau de 3 items, l'afficher, placer un nil à  l'item du milieu ...


    Insérer nil dans un NSArray ?
    Comment fais tu ça ?
    Les NSArray et autres collection d'obj-c n'acceptent que des objet.
    Tu veux dire un NSNull object ?
  • avril 2005 modifié #7
    C'est vrai que j'ai plus dis ça pour l'exemple que pour autre chose. Parlant d'un NSArray de NSString un peu comme un NSString *tab[]...
    Bref il est vrai qu'insérer nil (le vrai pas NSNull) dans un tableau existant n'est pas chose très claire).

    Le tout était de bien piger que dans
    NSArray *a=[NSArray arrayWithObjects:@a,nil,@c,nil];
    NSLog(@%@",a);

    Seul a s'affichait, je voulais exprimer ça :-\\
  • 23:33 modifié #8
    Heuu tant que j'vous tiens :p:p
    Je voudrais écrire sur un fichier plist qui se trouve sur mon serveur
    <br />- (void)URLResourceDidFinishLoading:(NSURL *)sender<br />{<br />	NSData			*data = [sender resourceDataUsingCache:YES];<br />	if(data){<br />		postScoresArray = [NSMutableArray arrayWithContentsOfURL:[NSURL URLWithString:SCORES_PLIST_URL]];<br />		[postScoresArray addObject:[self createRecord]];<br />		[postScoresArray writeToURL:[NSURL URLWithString:SCORES_PLIST_URL] atomically:NO];<br />		NSRunAlertPanel(@&quot;Score posté !&quot;, @&quot;Votre score a bien été posté sur le site ! Merci beaucoup !!!&quot;, nil, nil, nil);<br />	}<br />}
    


    Ok pas de plantage mais un problème -> Y'a rien de changé sur le fichier !
    et juste avant d'afficher mon panneau d'alerte, le log affiche :
    *** malloc[3256]: error for object 0x5b0d094: Non-aligned pointer being freed
    

  • BruBru Membre
    23:33 modifié #9
    dans 1114263541:

    C'est vrai que j'ai plus dis ça pour l'exemple que pour autre chose. Parlant d'un NSArray de NSString un peu comme un NSString *tab[]...
    Bref il est vrai qu'insérer nil (le vrai pas NSNull) dans un tableau existant n'est pas chose très claire).

    Le tout était de bien piger que dans
    NSArray *a=[NSArray arrayWithObjects:@a,nil,@c,nil];
    NSLog(@%@",a);

    Seul a s'affichait, je voulais exprimer ça :-\\


    Les listes d'arguments variables (comme par exemple, la liste des objets dans arrayWithObjects, ou plus simplement la liste dans NSLog ou printf) est une fonctionnalité du langage C reprise dans Objective-C.

    Pour faire simple, cette liste d'arguments est mise en mémoire puis l'appel à  la fonction utilisant ces arguments est réalisé. Mais cette fonction ne connait que l'emplacement (en mémoire) de cette liste, mais pas le nombre d'éléments qu'elle contient.

    Aussi, pour déterminer le nombre d'éléments qu'elle contient, plusieurs astuces sont utilisés :

    - passage explicite du nombre d'argument (exemple : Mafonction(3, arg1, arg2, arg3); ici, le premier argument 3 donne le nombre d'arguments qui suivent).

    - passage implicite du nombre d'argument (exemple : NSLog(@%i %f %c, arg1, arg2, arg3); ici, c'est le nombre de symbole % dans la chaine qui donne le nombre d'arguments).

    - insertion d'un marqueur de fin de liste : généralement, ce marqueur est représenté par une valeur impossible à  rencontrer dans les arguments. C'est le cas notamment pour les NSArray, ou nil est impossible à  insérer dans un tableau. Donc la méthode arrayWithObjects va lire la liste d'argument jusqu'à  rencontré nil.

    A noter que l'absence du nil provoque un plantage, car arrayWithInit va lire la liste d'argument au delà  de sa taille, d'où récupération de valeurs indéterminés.

    Dans ton exemple, le premier nil arrête la lecture de la liste d'arguments, donc seul l'objet NSString @a a été mis dans le NSArray.

    .
Connectez-vous ou Inscrivez-vous pour répondre.