NSTimer devrait convenir pour la plupart des fins. Ce ne sera pas exact - la période sera légèrement plus longue que ce que vous avez défini, mais dans de bonnes conditions seulement de très peu - pensez aux millisecondes. Cependant, NSTimer se déclenche via une boucle de runloop, donc sa précision dépend de cette boucle de runloop qui ne doit pas être occupée. Vous pouvez minimiser les problèmes en ayant une boucle de runloop dédiée, sur son propre thread, même si vous verrez toujours la période de votre minuteur s'étendre légèrement si le système est occupé.
Par conséquent, bien qu'il n'y ait pas de relation innée entre la vitesse du CPU et d'autres facteurs similaires, un matériel plus rapide pourra mieux suivre en raison du fait qu'il n'est pas occupé aussi souvent.
Notez également qu'un NSTimer répétitif ne décalera pas de phase - il sera aussi précis réglé sur un intervalle de 1s que sur 15s. La seule mise en garde est que si votre gestionnaire est toujours en cours d'exécution lorsque la prochaine exécution devrait avoir lieu, cette exécution ne se produira pas du tout. Par exemple, si vous prenez 1,1 seconde, l'intervalle entre les déclenchements passera à 2s.
Une alternative aux runloops et aux NSTimers est dispatch_after. Il n'est pas susceptible d'être plus précis cependant, et son patinage dépend toujours de la file d'attente cible (probablement l'une des files d'attente concurrentielles par défaut) qui ne doit pas être occupée lorsqu'elle se déclenche.