Des conseils sur la façon de prendre une “tentative d'insérer néant objet” à partir d'un périphérique nécessaire
Ici est une situation:
Hockeyapp et testflight chaque maintenant et puis se plaindre de moi
"de tenter d'insérer néant objet"
dans mutable dictionnaires/tableaux. Je sais que la bonne chose est de vérifier pour néant tout le temps, et je ne lorsque cela a du sens.. Nos testeurs ne peut pas attraper ces incidents, mais AppStore utilisateurs peuvent évidemment.
Ma conjecture est que, parfois, le serveur renvoie NSNulls quand il ne devrait pas.
Afin de ne pas insérer des contrôles pour les nul partout dans l'immense projet de mon idée était de créer une cible pour les testeurs et de l'utilisation de la méthode swizzling pour les classes de collection.
Dire, je vais remplacer insertObject:atIndex
avec mon swizzled_insertObject:atIndex
, où, si l'objet est en fait nul je log/afficher un rapport descriptif avant qu'il se bloque.
Le truc c'est que je ne peux pas utiliser swizzling pour __NSPlaceholderDictionary
ou __NSArrayM
(juste parce que je ne peux pas faire une catégorie sur les cours privés) et qui me rend triste.
Donc, fondamentalement, je suis demander des conseils sur la façon de prendre ces méchants rares plantages.
Une solution que j'ai à l'esprit est à l'aide de blocs try-catch, je sais qu'ils sont coûteux en Objective-c, donc je n'avais pas l'utiliser en production, juste pour les testeurs. Mais les méthodes entouré par try-catche
-s entouré par #ifdef
-#endif
-s efface toutes les readableness du code. Donc je suis à la recherche d'une solution plus élégante.
Merci.
Mise à jour: les traces de la pile sont unfortunaely pas très descriptif, voici ce que je reçois
Exception Type: SIGABRT
Exception Codes: #0 at 0x3a378350
Crashed Thread: 0
Application Specific Information:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[2]'
Last Exception Backtrace:
0 CoreFoundation 0x321522a3 <redacted> + 163
1 libobjc.A.dylib 0x39e7a97f _objc_exception_throw + 31
2 CoreFoundation 0x320a355f <redacted> + 135
3 CoreFoundation 0x320da0d3 <redacted> + 51
....
nil
partout. Les traces de la pile devrait vous dire exactement quelle ligne de code dans votre application est à l'origine du problème. Correctif de code spécifique. Mais ne vous contentez pas de vérifier pour nil
. Déterminer pourquoi vous obtenez nil
en premier lieu.C'est le problème - je ne peux pas déterminer pourquoi et où je veux en venir nulle. et les traces de la pile ne sont pas toujours descriptif de tout ce que j'obtiens est par exemple: erminating application en raison d'uncaught exception 'NSInvalidArgumentException', la raison: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: essayez d'insérer néant objet à partir d'objets[2]'
Une autre chose: Vous semblez être source de confusion
nil
avec NSNull
. NSNull
est un objet; il est couramment utilisé comme un espace réservé.C'est Andreas de HockeyApp.
<redacted>
est présent dans les traces de pile car iOS met dans. Pour tous les publics (non NDA) iOS versions, HockeyApp ne la remplacer par la bonne, les appels système. La raison pour laquelle <redacted>
apparaît en premier lieu parce que, de iOS optimisations internes. De toute façon, si vous avez besoin d'aide, vous devez afficher la trace de la pile complète au lieu de simplement les 4 premières lignes! Ce iTunes Connect montre et ce qu'il ne dit pas, c'est expliqué ici: stackoverflow.com/questions/15588072/...Juste pour être sûr, la trace de la pile HockeyApp rapports est près identique quel iOS écrit dans ses rapports de plantage. Il n'y a rien de mal avec les rapports de soi. Et comme expliqué dans mon précédent commentaire ici, HockeyApp est de ne rien faire de stupide.
OriginalL'auteur dariaa | 2013-06-27
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'ajouter une catégorie pour la méthode swizzling. J'ai été en mesure d'isoler un crash comme celui-ci par la méthode swizzling initWithObjects:forKeys:count: et de mettre un try/catch autour de l'appel de méthode d'origine. Enfin, j'ai ajouté un point d'arrêt dans la section catch. Cela m'a permis de rompre et de remonter la pile à l'endroit où la valeur nil a été utilisé. Ce code est ajouté en haut de mon AppDelegate.m:
Et puis dans mon application n'a finir le lancement de la méthode:
Cela m'a aidé un certain nombre de fois. Vous pouvez vous enregistrer les problèmes/erreurs d'essayer de comprendre le type de méthode de codage ( "@@:**L" ) en laissant l'Obj-C runtime travail pour vous: la Méthode m1 = class_getInstanceMethod(cible, @selector(initWithObjects:forKeys:count:)); const char *methodTypeEncoding = method_getTypeEncoding(m1); Ensuite, vous pouvez la passer en class_addMethod au lieu d'une chaîne codée en dur.
OriginalL'auteur Dav Yaginuma
Une chose à noter sur le crash du message lui-même.
"essayez d'insérer néant objet à partir d'objets[#]" signifie que la clé ou la valeur à l'indice [#] (la pensée d'un NSDictionary littérale de la liste) est nul.
Dire que j'ai un dictionnaire littérale
Alors l'index[0] serait la première paire dans la liste d'index[1] serait la deuxième paire et ainsi de suite. Si l'entrée de la paire est nul, il va déclencher cette exception avec l'index correspondant.
OriginalL'auteur SuperGuyAbe
supposons que vous récupérer les données à l'aide de JSON à partir du serveur, quelques fois un champ dans les données JSON est nulle,de sorte que vous pouvez obtenir NSNull après coversion.
donc, mon conseil est de vérifier la valeur "null" situation dans le serveur, si elle se produit, le retour de la faild msg ,mais ne délivre pas le mauvais format de données d'APPLICATION.
lors de l'APPLICATION de recevoir des données, l'APPLICATION ne sais pas comment le gérer. il est déjà anormal.
c'est pas grave que vous pouvez intercepter l'exception et d'ignorer la présence anormale de données, mais ma façon de le faire est d'empêcher qu'il se passe à partir de la source.
OriginalL'auteur adali
Dans la plupart des appels système ( iOS) ou le serveur de communication peut être nul, ou lorsque vous êtes au travail , à l'appel de la fonction de tiers libs.
Sur ces cas, il est un must pour vérifier une valeur nulle à mon humble avis.
Plusieurs anciens développeurs, architectes utiliser un multiple de déclaration en ligne.
Très mauvais comportement, je lernt ma leçon, il suffit d'écrire en ligne pour savoir qui de ligne s'est écrasé exactement le code. Beaucoup plus facile à résoudre.
Si vous ne pouvez pas trouver dans votre code. Il y a des bûcherons, des crash reporter les bibliothèques. L'utilisation de tout de que et vous obtiendrez les causes, le numéro de ligne, facile à corriger que les.
Je ne voudrais pas l'utiliser partout néant vérification ni try-catch, seulement dans les cas mentionnés ci-dessus
OriginalL'auteur
Viens de trouver en regardant où je suis la création de NSDictionaries et en ajoutant un peu d'affirmation des états pour vérifier si des objets sont nuls.
@{@"
- début de la création d'un dictionnaire à l'aide de syntaxe moderne, ouNSDictionary
Exécuter l'application, cochez la case de la console, trouver le correspondant d'affirmer et de le corriger:
Résiliation d'application en raison de uncaught exception 'NSInternalInconsistencyException', la raison: "Votre Objet est nul ici"
OriginalL'auteur Alex Stone
J'ai essayé de répondre à la troisième réponse, il me donne l'aider dans la plupart des cas. Cependant, lors de mon projet de cadre de soutien 64, j'ai rencontré un désastreux Ben effondrement, causé par un tiers bibliothèque statique. Ben effondrement des points CFDictionaryContainsKey.
Quand Ben effondrement myDictionaryRef est nul.
Après quelques tests, j'ai trouvé un problème.
Comparer les réponses
Différents types de paramètres causé Ben effondrement.
donc, je pense que la bonne réponse est
Merci des réponses de fournisseurs, mais aussi parce que j'ai assez de réputation 50. Je ne peux pas commenter directement. J'espère que vous me donner un vote.
OriginalL'auteur Blowing a big balloon