2011-10-07 1 views
0

Est-ce que detachNewThreadSelector fonctionne différemment de performSelectorInBackground? Dans mon projet, je l'utilise beaucoup de ceci:Est-ce que detachNewThreadSelector fonctionne différemment de NSThread performSelectorInBackground ou NSThread alloc/init puis [début de thread]

[self performSelectorInBackground:@selector(startImageDownloads:) withObject:[NSNumber numberWithInt:dataType]]; 

mais je fais ce soit différent:

[NSThread detachNewThreadSelector:@selector(startImageDownloads:) toTarget:self withObject:[NSNumber numberWithInt:dataType]]; 

Et aussi, en plus d'être en mesure d'accéder à l'objet de fil avec imgDlThread, serait alloc/init « ing un fil puis start ing fonctionner différent alors la première 2:

NSThread *imgDlThread = [[NSThread alloc] initWithTarget:self selector:@selector(startImageDownloads:) object:[NSNumber numberWithInt:dataType]]; 
[imgDlThread start]; 

Merci!


Edit:

il y a juste réalisé plusieurs réponses sur SO déjà la différence (ou l'absence) entre performSelectorInBackground et detachNewThreadSelector, donc je suppose que ma seule question est:

Est allouer et initialiser un NSThread puis en appelant [thread start] tout différent puis le premier 2?

Répondre

1

La seule différence entre la troisième méthode et les deux premières est la gestion de la mémoire. Lorsque vous allouez un thread, il conserve target, uniquement pour être libéré lorsque le thread est désalloué. La méthode detatchNewThreadSelector: et la méthode performSelectorInBackground: autorisent toutes les deux la création NSThread qui en résulte, ce qui signifie qu'une fois le thread terminé, le target sera publié.

Dans le code que vous avez fourni (allouer un fil et démarrer), vous êtes une fuite imgDlThread, ce qui signifie que target ne seront jamais libérés, et à son tour, sera lui-même fuyait. Si vous autorelease ou même libérer régulièrement imgDlThread après le démarrage, il aura exactement le même effet que detachNewThreadSelector:.