10
votes

EXC_BAD_Access Message envoyé à une instance de distribution, mais j'utilise ARC?

J'ai une application qui reçoit des informations à partir d'un service Web SOAP et je souhaite afficher les résultats dans un utableview code>.

J'ai eu une version précédente de cette application et je crée une nouvelle version pour nettoyer les choses essentiellement propres et éliminer un groupe de code hérité qui est obsolète et n'est plus utilisé. P>

dans le précédent version, cela a bien fonctionné. Dans la nouvelle version, pas tellement. P>

Fondamentalement, le scénario actuel renvoie 3 cordes que j'essaie d'utiliser comme base pour les données de mon utableview code>.

Je me débats avec ce problème car il est si puant de suivre exc_bad_access code> erreurs! p>

(entre parenthétiquement, si quelqu'un a un moyen de faire l'expérience de débogage plus semblable à Visual Studio, j'aimerais l'entendre! Il est tellement frustrant de ne pas avoir aucune idée de la ligne qui a provoqué l'erreur, et aussi ne pas être capable de regarder à travers mes variables locales au moment de l'accident pour voir ce que c'est quoi. J'ai déjà ajouté au point d'arrêt d'exception, mais cela ne semble pas faire beaucoup.) P>

Quoi qu'il en soit, La ligne qui cause l'erreur semble être la suivante: p>

return [[self Libraries] count];


13 commentaires

Arc uniquement simplifie Gestion de la mémoire. Cela ne prend pas complètement de plus pour vous.


Garçon, c'est un commentaire inutile. Comment cela me dirige-t-il même vers la résolution de mon problème? Fondamentalement, mes questions sont ceci: comment puis-je être trop libéré de quelque chose lorsque j'ai absolument zéro relâche instections de mon code? Merci!


J'utilise des instruments pour jeter un coup d'œil à cette bête. Fondamentalement, il semble que une méthode particulière fera parfois une retenue / libération, mais parfois, il fait une retenue / libération / libération. Je suppose que c'est là que réside le problème, mais je ne peux pas comprendre comment déterminer où ce problème se produit. En outre, [Objet RetainCount] est interdit à l'aide de l'arc. Comment puis-je suivre cette erreur mieux?


Vous n'avez pas de relâche dans votre code parce que GCC les a mis là-bas pour vous. Vous devez toujours savoir où ils iraient sinon .


@Jonathan Grynspan tandis que votre intention est bonne: "En savoir plus" qui s'applique partiellement ici car l'arc fait des choses que nous les programmeurs ne peut pas, en particulier lors du retour des objets automatiques. Ce qui aiderait probablement beaucoup, c'est pour le PO d'étudier la documentation de l'ARC, pas différemment de votre conseil. En particulier, les conventions de nommage sont obligatoires pour le succès de l'ARC et l'OP est au moins dans certains cas les ignorant.


Arc ne fait rien que nous ne pouvons pas déjà faire. Il suffit de la simplifier. Vous devez toujours comprendre ce que cela fait sous les couvertures afin d'éviter ces types de problèmes.


@Jonathan Grynspan: vraiment? CE N'EST PAS VRAI!!! Par exemple, en utilisant l'arc, la conserver, la libération, l'autorelease et même la rétention de retenir sont interdites par le compilateur! Je comprends la gestion de la mémoire. Je sais où ces déclarations devraient aller. Comme vous le voyez dans mon message ci-dessous, il s'avère que mon code était bien et c'était un bug de bêta Xcode 4.2. Je ne pense pas que vous comprenez très bien l'arc.


@ MBM30075 à peu près sûr que je le fais, mais ce n'est pas l'endroit pour ce genre de discussion.


@JonathangRynspan alors pourquoi diriez-vous «cela ne prend pas complètement de plus pour vous»? En fait, c'est exactement ce que ça fait. Il suffit spécifiquement de cela, l'intention de faire de la gestion de la mémoire automatique. À cette fin, il interdit spécifiquement à la gestion de la mémoire manuelle. Qu'est-ce que cela partit exactement en ce qui concerne la gestion de la mémoire traditionnelle?


Peut-être devriez-vous y en retrouver un peu plus. :) Ce n'est pas le lieu approprié pour cette discussion, cependant.


@JonathanGrynspan répondant à «Je ne vais pas en parler», il semblerait que vous n'ayez pas une vraie réponse. Ma question reste toujours: quelle est la gestion de la mémoire manuelle traditionnelle lorsque vous utilisez ARC? Réponse: Aucun! Cela vous enlève spécifiquement de vous.


De nouvelles questions doivent être posées dans nouvelles questions , pas de threads de commentaires. Je serais heureux de vous répondre dans un nouveau post.


Vous n'êtes pas obligé de savoir où conserver et libérer des déclarations seraient insérées afin d'écrire un code ARC (qui annulerait tout le point d'arc). Pensez au lieu de penser en termes de propriété d'objet et de relations.


3 Réponses :


23
votes

Ensemble NszombieEnabled , Mallocstacklogging , et Guard Malloc dans le débogueur. Ensuite, lorsque votre application se bloque, tapez ceci dans la console GDB: xxx

remplacer 0x543216 avec l'adresse de l'objet qui a provoqué le crash, et vous obtiendrez un Taille de pile beaucoup plus utile et cela devrait vous aider à identifier la ligne exacte dans votre code qui cause le problème.

Voir cet article pour des instructions plus détaillées.


5 commentaires

C'était utile pour moi pour suivre exactement quelle ligne / variable causait l'accident, alors merci!


@ MBM30075 - NP, content de pouvoir aider!


Quelqu'un sache comment faire cela avec LLDB?


@ Stianhøiland Avez-vous déjà trouvé une option similaire pour LLDB?


Lien vers la version LLDB: Stackoverflow.com/questions/9738994/...



2
votes

ARC s'appuie sur les pratiques de dénomination de la norme Apple / recommandées. Vérifiez que vous ne violez aucun d'entre eux.

Juste pour commencer, si " bibliothèques " est une instance il y a des problèmes de dénomination.


2 commentaires

Comme je l'ai mentionné ci-dessus, je n'ai pas vu cette règle de la convention de dénomination. Pouvez-vous poster un lien vers où vous l'avez trouvé? Merci!


Voir: Directives de codage pour Cacao



1
votes

OK, je me sens donc un peu stupide, mais j'ai deux machines de production. Sur l'une d'entre elles, j'avais installé une copie de Xcode 4.2 Beta à côté de la dernière copie de production. J'ai oublié de désinstaller la copie bêta et l'utilisait pour exécuter mon code. Dès que j'ai effacé cela et avoir couru mon code contre la finale, publié Xcode 4.2, tout fonctionne bien à nouveau.

Comme je l'ai mentionné à Jonathan Grynspan ci-dessus, je comprends la gestion de la mémoire Obj-C. Pour une raison quelconque, je recevais une retenue / libération / libération (effectuée par Arc) et que le bogue est corrigé dans la version finale.

Merci pour l'aide pour le suivre! Au moins, j'ai une réponse définitive sur la raison pour laquelle le problème existait!


0 commentaires