2012-03-29 2 views
2

J'utilise le Facebook iOS SDK pour un projet et si j'ouvre un UIViewController après avoir fait une demande mais avant de recevoir une réponse, j'obtiens un EXC_BAD_ACCESS quand il essaie de voir si le délégué répond à un sélecteur. Eh bien, le délégué est le UIViewController qui a déjà sauté, donc il n'existe probablement plus.iOS Facebook SDK SDK ne conservant pas de délégué causant un EXC_BAD_ACCESS

Lors de la recherche sur ce problème je suis tombé sur this répondre ici sur SO qui me disent que je ne devrais pas avoir ce problème puisque le délégué est retenu. Mais la réponse est un peu ancienne et ils ont commencé à utiliser l'arc après cela. J'ai donc vérifié le SDK et remarqué qu'ils ne le retenaient plus.

Est-ce un problème connu? Est-ce que j'ai râté quelque chose?

J'ai essayé de modifier le SDK et de conserver le délégué et le problème disparaît. Néanmoins, je n'aime pas modifier les bibliothèques tierces car je n'ai pas beaucoup d'expertise et je ne suis pas sûr si l'arc est vraiment un problème dans cette situation (je pensais que nous n'avions pas besoin d'utiliser retaing/release/autorelease plus). En outre, je pensais que ce soit Facebook SDK, si c'était un bug quelqu'un devrait déjà trébuché sur le même problème et résolu.

EDIT: Je me rends compte maintenant que au moins la version que je utilise du SDK Facebook est de ne pas utiliser l'arc (je ne sais pas si elles soutiennent déjà) et le problème peut être ceci:

@property(nonatomic,assign) id<FBRequestDelegate> delegate; 

Ne devrait-il pas être conservé?

EDIT2: Je suis désolé, j'ai ignoré un autre answer dans le même post lié plus tôt.

Il semble que ce que j'ai signalé est maintenant obsolète dans les versions plus récentes du SDK. La meilleure approche semble être d'annuler la demande.

Répondre

0

Ne devrait-il pas être conservé?

Absolument pas. Si vous avez fait cela alors vous auriez très probablement un cycle de conservation (VC possédant le FBRequest qui possède le VC).

Vous avez 100% raison que la bonne chose à faire est d'annuler la demande lorsque le contrôleur de vue est désalloué, ou mieux encore est de définir le délégué de la demande à nil puis de l'annuler.