10
votes

IOS5 Crashes lors de la piste de ruissellement: Beforedate:

J'ai un problème de compatibilité de mon application avec une version IOS5 B7 et GM.

Le problème se produit dans les prochaines lignes de code: P>

do {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
} while (!done);


0 commentaires

4 Réponses :


2
votes

Ceci ressemble à problème de mémoire strong>, veuillez cocher Apple Technote QA1367 " Recherche exc_bad_access Bugs dans un projet de cacao "

dans votre code, essayez-le à Crash dès que possible forts>: P>

#include <pthread.h>
- (void)myFunction
{
    NSLog(@"Thread (%d)",
        pthread_mach_thread_np(pthread_self()));
}


6 commentaires

Oui, il fonctionne dans un fil séparé. Et non, il n'y a pas de problèmes de mémoire à cause de tout ce qui fonctionne correctement dans iOS4 et Apple ne publiera pas d'échantillon avec des erreurs de mémoire.


J'ai eu un mauvais code d'échantillon d'Apple ou peut-être que c'est comme ça que je l'ai utilisé :) Problèmes de threading potentiels: Toutes les utilisateurs doivent être en maintenance. Toutes les trucs d'ALASSET au moins dans le même fil, peut-être même en main (pas sûr). Sinon, partager des données entre les threads peut-être avec NSLOCK ou @Synchronized


Tout fonctionne bien sur iOS4 ... et il n'y a pas d'interface utilisateur dans ce fil.


Les outils iOS4 sont moins stricts, donc cela ne signifie pas vraiment quoi que ce soit. Maintenant, l'application de débogage qui fonctionne bien sur iOS5GM mais ne compile même pas à compiler avec iOS4 SDK: (vous avez déjà "analysé" et corrigé tous les problèmes potentiels?


UI dans des threads non principaux: Pourriez-vous avoir du code, qui veut afficher l'interface utilisateur dans certains cas par ex. NsurlConnection, AlstretsLibrary, Nstimer? Délégué Pointeur Code d'exécution dans le mauvais fil, certains soi-même devraient être __blockez-moi? Eh bien, suppose que je manque d'idées avec un filetage.


Merci de votre aide. J'ai essayé de décrire le problème dans ma réponse. J'ai voté votre réponse, merci. Si vous aurez des idées sur la question, je serais heureux de les entendre.



1
votes

Regard sur votre code: Où est-ce que "FAIT" VARIABLE vient de et qui change sa valeur et quand? Maintenant, ça a l'air assez magique.

Aussi, vous pouvez vérifier la valeur de retour de Runmode: Beforatedate pour vous assurer qu'il était exécuté. Si la valeur de retour n'est pas non, Runloop n'a pas été exécuté du tout. Peut-être qu'une autre partie de votre code ne peut pas gérer ces cas?


1 commentaires

Avec fait variable tout va bien. Runmode: fonctionne fonctionne. J'ai trouvé le problème et je répondra bientôt. Vérifiez-le, il y a aussi quelques questions.



10
votes

4 heures passées et j'ai trouvé le problème. Je vais décrire comment j'ai résolu le problème dans xmlperformance échantillon .

Le problème était dans nsautoreleeepool . Il y a @property (nonatomic, assigné) nsautoreleeepool * téléchargdalandparsepool; . Lorsque l'application commence à télécharger top300 applications payées RSS Nouveau thread est créée à l'aide de [NSTHREAD SetachNeadSelector: @Selector (DownloadAnse :) TOTArget: auto withl]; . Donc, dans ce fil, nous devrions garder la piscine de l'autorelease locale. Il se fait à la prochaine intention: xxx

donc dans téléchargdalandparse: tout va bien. Maintenant, regardons dans une méthode appelée lorsqu'un élément de RSS est analysé: xxx

comme vous voyez des lignes: xxx

Donc, exactement que les lignes provoquent l'exception. Si je les commente, tout fonctionne bien.

mais j'ai décidé non seulement de commenter ces lignes mais également remplacer nsaToreleeePool dans - (NSURL *) URL avec @Autorelease Le bloc tel qu'il est dit qu'il est plus efficace: xxx

Tout fonctionne bien. Le seul problème que je n'ai pas résolu est: xxx

Donc, si quelqu'un a des idées à propos de ce problème peut poster une autre réponse et essayer d'expliquer plus correctement le bug réparer. Je serai heureux d'accepter cette réponse.

Merci.


2 commentaires

Le code d'origine utilisait un nsautoreleePool commun et essayant de le réinitialiser, lorsqu'il est estimé qu'il est "complet". J'aurais remplacé ce code avec un simple drain [Self.DowntHownloadandandandsePool], qui devrait faire la même chose, mais être plus sûr. Vous réparez était d'ajouter une deuxième piscine à l'intérieur du premier. Devrait être ok et définitivement plus sûr.


Merci, Jom, pour votre réponse.



0
votes

Juste ma petite contribution.

Comme j'ai le même problème, j'ai découvert que dans iOS5, vous n'avez pas besoin d'avoir votre propre NsaTorelEeSePool dans un fil (utilisé par PresqueSelectoronmainthread).

Puis, dans votre code (un analyseur XML-idem que moi), je pense que vous devez séparer le code de iOS4 et iOS5.

avec iOS4, vous avez besoin de NsAutoreleeePool, mais pas avec iOS5.


0 commentaires