setInteger / setObject

muqaddarmuqaddar Administrateur
21:36 modifié dans API AppKit #1
Salut,

Quand vous sauvegardez vos préférences, pour un entier, vous utilisez setInteger ou setObject ?
Y a t-il un intérêt avec setInteger plutôt que le terme générique ?

Réponses

  • ChachaChacha Membre
    21:36 modifié #2
    setObject prend en argument un objet.
    setInteger prend en argument un int, qui est convertit en objet, puisque d'après la doc de setInteger:

    Invokes setObject:forKey: as part of its implementation.

    Disons que si tu dispose d'un "int", en utilisant setInteger, tu écris un code plus court et plus lisible, puisque ce n'est pas toi qui fait la conversion en objet. La méthode est fournie parce qu'elle est pratique, et même si elle n'est pas indispensable, autant l'utiliser.

    +
    Chacha
  • muqaddarmuqaddar Administrateur
    21:36 modifié #3
    Ok, c'est ce que je me disais, mais comme j'avais déjà  vu du code avec setObject même pour les entiers... :)

  • muqaddarmuqaddar Administrateur
    21:36 modifié #4
    J'ai un drôle de bug. Comme d'habitude, vous allez me dire... ;)

    Je sauvegarde un array dans mes prefs avec :
    [prefs setObject:saveArray forKey:@prefsPluginsArray];

    Ensuite je fais un NSLog sur la clé :
    NSLog (@prefsPluginsArray : %@", [prefs objectForKey:@prefsPluginsArray]);

    Qui me donne les bonnes valeurs :

    [tt]prefsPluginsArray : <CFArray 0x3103c0 [0xa01900e0]>{type = mutable-small, count = 3, values = (
    0 : <CFDictionary 0x310360 [0xa01900e0]>{type = mutable, count = 3, capacity = 17, pairs = (
    0 : <CFString 0x3103f0 [0xa01900e0]>{contents = "id"} = <CFNumber 0x310230 [0xa01900e0]>{value = +0, type = kCFNumberSInt32Type}
    9 : <CFString 0x3103b0 [0xa01900e0]>{contents = "state"} = <CFBoolean 0xa0190b90 [0xa01900e0]>{value = true}
    17 : <CFString 0x310390 [0xa01900e0]>{contents = "name"} = <CFString 0x3103a0 [0xa01900e0]>{contents = "Mail"}
    )}
    1 : <CFDictionary 0x3104f0 [0xa01900e0]>{type = mutable, count = 3, capacity = 17, pairs = (
    0 : <CFString 0x3103f0 [0xa01900e0]>{contents = "id"} = <CFNumber 0x3104e0 [0xa01900e0]>{value = +1, type = kCFNumberSInt64Type}
    9 : <CFString 0x3103b0 [0xa01900e0]>{contents = "state"} = <CFBoolean 0xa0190b90 [0xa01900e0]>{value = false}
    17 : <CFString 0x310390 [0xa01900e0]>{contents = "name"} = <CFString 0x3105e0 [0xa01900e0]>{contents = "Entourage"}
    )}
    2 : <CFDictionary 0x310610 [0xa01900e0]>{type = mutable, count = 3, capacity = 17, pairs = (
    0 : <CFString 0x3103f0 [0xa01900e0]>{contents = "id"} = <CFNumber 0x310600 [0xa01900e0]>{value = +2, type = kCFNumberSInt64Type}
    9 : <CFString 0x3103b0 [0xa01900e0]>{contents = "state"} = <CFBoolean 0xa0190b90 [0xa01900e0]>{value = true}
    17 : <CFString 0x310390 [0xa01900e0]>{contents = "name"} = <CFString 0x310700 [0xa01900e0]>{contents = "iTunes"}
    )}
    )}
    [/tt]

    Mes booléennes sont bien bonnes pa rapport à  ma table.
    Sauf que ds le plist, elles restent toutes à  true !

    <key>prefsPluginsArray</key>
    <array>
    <dict>
    <key>id</key>
    <integer>0</integer>
    <key>name</key>
    <string>Mail</string>
    <key>state</key>
    <true/>
    </dict>
    <dict>
    <key>id</key>
    <integer>1</integer>
    <key>name</key>
    <string>Entourage</string>
    <key>state</key>
    <true/>
    </dict>
    <dict>
    <key>id</key>
    <integer>2</integer>
    <key>name</key>
    <string>iTunes</string>
    <key>state</key>
    <true/>
    </dict>
    </array>

    Du moment que je fais un setObject, elles devraient écrite instantanément pourtant ! non ?
  • ClicCoolClicCool Membre
    21:36 modifié #5
    Salut Oxitan

    Les userDefault sont automatiquement et régulièrement synchronisées (valeur en mémoirs vs plist sur disque).

    Si tu veux être certains d'avoir les mêmes valeurs de chaque coté à  un instant t, tu dois appeler:

    [mesPrefs synchronise];

    :)
  • muqaddarmuqaddar Administrateur
    avril 2005 modifié #6
    Oui mais je comprends pas pourquoi elles ne sont pas écrites avec mon setObject instantanément. Et même par la suite, quand j'ai fermé le prog !

    EDIT : synchronize me fait planter la fenêtre des prefs... :(
  • muqaddarmuqaddar Administrateur
    21:36 modifié #7
    J'ai un autre soucis de code cette fois-ci.

    Je récupère un integer de mes prefs avec [dict ObjectForKey].

    Je veux le comparer à  un entier : 0

    En NSLog [dict ObjectForKey:@id] me donne bien ma valeur entière 0,1,2..etc

    Mais impossible de le comparer :
    if ([[dict ObjectForKey:@id] intValue]==0) marche pas.
    if ([dict ObjectForKey:@id]==0) marche pas.

    J'ai même essayé en créant un NSNumber et avec isEqualTo...

    So what ?
  • muqaddarmuqaddar Administrateur
    21:36 modifié #8
    J'ai résolu ce dernier pb. ça venait d'un objet bool qui ne voulait pas d'un boolValue... :)

    Sinon, une de mes prefs, voire au dessus, fait tjs la rebelle, la coquine.
    http://www.objective-cocoa.org/forum/index.php?topic=820.msg9519#msg9519
  • fouffouf Membre
    21:36 modifié #9
    Ah bah, c'est une bonne nouvelle  ;)

    Excuse-moi pour le lapin d'il ya 5 minutes.  o:)
Connectez-vous ou Inscrivez-vous pour répondre.