J'ai un problème étrange. J'utilise une méthode des frameworks privés d'Apple dans mon application. Quand je l'appelle pour la première fois, ça marche. Quand je l'appelle pour la deuxième fois immédiatement sans rien entre les deux, il se bloque. Cependant, si je mets NSLog entre les deux appels, cela fonctionne à merveille. J'essaie donc de supprimer NSLog et de mettre entre-elles les boucles for-loops, sleep(), printf ("...") et fprintf (stderr, "...") pour émuler NSLog, mais cela n'aide pas. Je me demande comment la méthode sait que j'utilise NSLog? En d'autres termes, que fait réellement NSLog pour affecter les comportements de la méthode?Que fait réellement NSLog?
Merci beaucoup!
EDIT:
me semble résoudre ce problème. Je vais partager ma solution ici et j'espère que cela pourra être utile à certaines personnes.
Je crée une application multitouch utilisant MultitouchSupport.framework. J'ai copié le code de http://aladino.dmi.unict.it/?a=multitouch et ajouté un CFRelease
à la fin de la boucle. Donc, au fond, ma principale méthode ressemble à ceci:
int main(void) {
int i;
NSMutableArray* deviceList = (NSMutableArray*)MTDeviceCreateList(); //grab our device list
for(i = 0; i<[deviceList count]; i++) { //iterate available devices
MTRegisterContactFrameCallback([deviceList objectAtIndex:i], touchCallback); //assign callback for device
MTDeviceStart([deviceList objectAtIndex:i], 0); //start sending events
}
CFRelease((CFMutableArrayRef)deviceList);
printf("Ctrl-C to abort\n");
sleep(-1);
return 0;
}
Après avoir exécuté pendant un certain temps, il affichera « signal reçu programme: « EXC_BAD_ACCESS ». » Et voici la trace de la pile:
#0 0x7fff8795496e in ParsedMultitouchFrameRepInitialize
#1 0x7fff879565b1 in mt_HandleMultitouchFrame
#2 0x7fff87955a03 in mt_DequeueDataFromDriver
#3 0x7fff87955b29 in mt_DequeueMultitouchDataFromDriverThreadEntry
#4 0x7fff831b3456 in _pthread_start
#5 0x7fff831b3309 in thread_start
Cependant, il ne plantera pas si je mets NSLog ci-dessous MTDeviceStart.
La raison pour laquelle j'ai ajouté CFRelease((CFMutableArrayRef)deviceList)
au code original est que je pense que les objets créés à partir de fonctions nommées * Create * ou * Copy * doivent être libérés par nous-mêmes. Mais il s'avère que si je le supprime comme le fait le code original, il ne tombera pas en panne, même sans utiliser NSLog. Donc, c'est peut-être parce que je publie deviceList
trop tôt? Mais si c'est le cas, pourquoi NSLog semble-t-il capable d'empêcher le crash?
Cela n'a probablement rien à voir avec le NSLog. Je posterais du code. –
Veuillez modifier le code et la trace de la pile dans votre question. –
Vous avez raison au sujet de la convention de nommage, mais puisque 'MTDeviceCreateList' est une fonction privée, il peut y avoir violation/non-conformité. (Cela signifie peut-être "créer le tableau de périphériques qui est destiné à rester actif pendant toute la durée du processus et le renvoyer".) Essayez d'exécuter votre programme (avec crash) sous Instrument Zombies d'Instruments. Avec cela, vous devriez être en mesure de prouver si votre version est une version supérieure, ou autrement déterminer la véritable cause de l'accident. –