11
votes

iOS: "Tentative d'insérer Nil objet à partir d'objets [1]" lors de la création de dictionnaire

Je crée une classe de barres de navigation personnalisée et je personnalise ses attributs de titre en utilisant le code suivant: xxx

Toutefois, lorsque j'exécute le code, il renvoie le message d'erreur suivant: xxx

J'utilise xcode 4.6 et exécuté sur un périphérique à l'aide de iOS 6.


0 commentaires

3 Réponses :


6
votes

Les paramètres des littéraux (valeurs et clés de votre dictionnaire) ne doivent pas être nil .

Si vous préférez un constructeur moins strict, vous pouvez envisager d'utiliser + [NSDictionary DictionaryWithObjectSandkeys:] à la place.


9 commentaires

Ce n'est pas moins strict, il pense simplement que les arguments ont arrêté si un nil est trouvé lorsqu'une touche était attendue. Navigiez notamment si vous passez un objet nil , vous obtiendrez exactement la même exception.


@Kevinballard non-sens. Qu'est-ce qui est retourné de [NSDictionary DictionaryWithObjectSandkeys: @ "A", @ "A", NIL, @ "B", NIL]; ? Il cesse de lire au premier argument de l'objet Nil.


Désolé, je voulais dire un objet quand j'ai dit la clé (méthode Darn retournée). Il ne peut pas distinguer un objet nil et la sentinelle nil . Essayez d'utiliser nil pour une touche et voyez ce que je veux dire: [NSDictionary DictionaryWithObjectSandkeys: @ "ANOBJ", @ "ANEKE", @ "autreobj", nil, nil] .


@Kevinballard Oui, je sais ce qui se passe si une clé est manquante lorsque + [Nsdictionary DictionaryWithObjectSandkeys:] est utilisé. Cela ne s'applique pas à ce contexte car si le cadre Constant Keys uitéxtattributefont ou uitéxtattributeetextextextextextext était nil ... beaucoup de programmes vont casser. Alors oui, les gens utilisent + [Nsdictionary DictionaryWithObjectSandkeys:] To Court Circuit Dictionnaire Paramètres de construction où les littéraux ne peuvent pas en présence d'entrées facultatives. Les littéraux OTOH, interdisent que tout est entièrement - toutes les clés et valeurs doivent être des objets valides.


La plupart des gens ont tendance à penser que le comportement nil -Object-raccourci est réellement mauvais car il peut tronquer silencieusement votre dictionnaire.


@Kevinballard, je ne suis pas sûr de "la plupart des gens" dans ce cas - jamais interrogé. Vous pouvez déduire une hésitation / prudence de mon choix de mots dans la réponse. Je connais beaucoup d'Objc devs vraiment comme nil comme une valeur magique ou facultative dans les API système et dans leurs programmes - je pense que cela fait mal plus que de l'aide. C'est-à-dire que je privilégie beaucoup les sémantiques plus strictes - mais j'ai rencontré beaucoup de devs objc qui le préfèrent lax.


Je suis passé à DictionaryWithObjectSandkeys: , fonctionne mieux que @ {} pour le moment.


J'ai exactement le même problème et réparer avec DictionaryWithObjectSandkeys: merci.


Ce n'est pas une bonne suggestion, des bugs plus subtils peuvent résulter de l'utilisation de cette méthode, comme des données manquantes si, par exemple, vous rempliriez une réponse à un serveur et envoie tel quel. La meilleure action consiste à vérifier les données avant d'insérer dans une dict.



10
votes

On dirait que votre bariol est nil . Vous ne pouvez pas stocker nil dans un dictionnaire.

EDIT:

En fait, êtes-vous sûr que c'est la bonne ligne de code? Vos références d'erreur Nsplaceholderarray , qui suggère que c'est un problème avec un @ [] littéral, pas un @ {} littéral.


3 commentaires

@Justin: DictionnaireWithObjects: Forçays: Nombre: n'utilise pas nsarray s. Il utilise des tableaux C.


WHOOPS - NONSENSE est retourné :) Il est toujours possible que Nsarrays soient créés dans le processus de construction du dictionnaire (ou appelant un autre constructeur), donc le message de l'exception.


@Justin: un NSDictionary littéral ne construise pas intermédiaire nsarray s. Donc, à moins que -SetTlettextatTtributes: fait quelque chose de funky, ce n'est pas le cas.



4
votes

Cette erreur semble être ailleurs. Il pointe d'une erreur de tableau à l'objet '1'. Dans votre cas, vous avez un dictionnaire et un objet '1' est uitextattributeetextcolor: [Uicolor Whitecolor] qui ne sera jamais nul.


2 commentaires

Oui, pour ceux qui viennent de visiter le [] du message d'exception, il s'agit du décalage de la matrice à 0 indexé de l'objet défaillant (NIL). Testé avec: nsstring * str = nil; Nsdictionary * foo = @ {nsfontatattributename: str, nsforegroundColorattributename: @ "B ooboo"};


@ROBM BOOM! Joli.