La lecture NSDictionary Clés à partir de listes de propriété
dans mon projet, je suis à l'aide d'un propertyList pour la gestion de données. le fichier plist est nommé "Base de données.plist". la Racine de la Base de données.plist est un dictionnaire qui contient 5 les dictionnaires comme des éléments enfant... maintenant le sous-Dictionnaire contient 4 fils dont un est toujours un webaddress avec la clé "URL" (Sans les guillemets)....
je suis l'exécution du code suivant pour extraire la valeur de cette clé URL, mais il ne fonctionne pas..
NSString *path = [[NSBundle mainBundle] pathForResource:@"DataBase" ofType:@"plist"];
NSDictionary *rootDict = [[NSDictionary alloc] initWithContentsOfFile:path];
NSString *URLforAll = [[NSString alloc] init];
for (id key in rootDict)
{
if(key == rowString)
{
NSDictionary *dict = [rootDict objectForKey:key];
URLforAll = [dict objectForKey:@"URL"];
}
}
la rowstring est une chaîne de caractères dont la valeur est la même que le texte dans la cellule sélectionnée (je l'ai testé , c'est précis).
Merci de m'aider si vous pouvez.... je vais être reconnaissants
OriginalL'auteur valiantb | 2009-06-21
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser
[key isEqualToString: rowString]
au lieu de comparer la clé et rowString directement à l'aide de==
. Je pense que==
compare l'objet du pointeur de valeurs, qui ne seront pas d'équivalent, même si les chaînes de match.Également juste en passant, vous n'avez pas besoin d'initialiser URLforAll avant de l'installer. Lorsque vous définissez égal à
[dict objectForKey:@"URL"]
vous perdez le pointeur vers l'objet que vous avez déjà créé et il sera coulé. Au lieu de cela, il suffit de direNSString *URLforAll = nil
; ou créer une nouvelle chaîne etautorelease
en sorte que l'objet sera automatiquement nettoyé:D'abord - merci une tonne pour aider -isequalToString a parfaitement fonctionné.... .. . .... et d'Après le code ci-dessus, je dois ajouter [URLforAll release]; au lieu d'utiliser des [[[NSSTring alloc] init] autorelease]; ne de la mémoire obtient toujours fui... si elle ne vous plaît dites-moi comment... s'il vous plaît ne me dire... et aussi j'ai lu quelque part que l'utilisation d'autorelease pour iphone n'est pas suggéré.... et sur le nom URLofAll il a été modifié pour la question... merci mille fois pour l'aide
Vous n'avez pas besoin d'alloc/init URLforALl à tous. Juste l'initialiser à zéro. Le dictionnaire de l'objectForKey: méthode sera de retour, vous vous donner un autoreleased objet.
C'est vrai, si vous pouvez garantir que si la condition à l'intérieur de la boucle for sera vrai pour l'une des clés. Sans cette garantie, la variable peut être nul, ce qui pourrait être problématique. L'extrait de code n'est pas assez dire, et le code n'est pas très évident, que ce soit. Nous sommes tous juste deviner ce que l'intention est...
OriginalL'auteur Ben Gotow
De plus, dans votre code:
Ce qui ne fait pas sens. Voici quelques questions:
URLforAll = [dict objectForKey:@"URL"];
. Donc, vous auriez besoin de le libérer avant de l'écraser.[dict objectForKey:@"URL"]
renvoie un objet qui ne vous appartient pas. Ainsi, à la fin de la boucle, vous ne savez pas si vous possédez URLforAll ou pas.[[NSString alloc] init]
ne fait pas de sens parce que vous devriez utiliser@""
, qui renvoie une constante, vide,NSString
qui est imperméable àretain/release/autorelease
questions.De traiter également avec la isEqualToString problème, mais en ignorant amrox est bien meilleure solution, le code serait:
Noter que
objectForKey
peut bien retourner une référence interne à l'objet qui va devenir non valide lorsque vous relâchez le dictionnaire, d'où la nécessité pour le maintien de l'objet si vous voulez le garder plus longtemps que la durée de vie du dictionnaire.amrox l'utilisation de:
est une meilleure solution, mais vous devriez vous undertand quel est le problème avec votre solution originale ainsi.
OriginalL'auteur Peter N Lewis
Vous n'avez pas besoin d'une boucle sur le dictionnaire. Il suffit de demander pour les données que vous souhaitez.
fait une boucle dans le dictionnaire est nécessaire pour le projet, en sachant que le keystring contient toujours une valeur.... Merci beaucoup pour l'aide...... Un million de mercis
[[[NSDictionary alloc] initWithContentsOfFile:path] autorelease]
peut être écrite comme[NSDictionary dictionaryWithContentsOfFile:path]
OriginalL'auteur amrox