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
....
Vous n'avez pas besoin de vérifier pour 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