¿Cómo funciona -performSelector: withObject: afterDelay: work?

Actualmente estoy trabajando bajo el supuesto de que-performSelector:withObject:afterDelay: no utiliza subprocesos, pero programa un evento para activarse en una fecha posterior en el subproceso actual. ¿Es esto correcto?

Más específicamente:

- (void) methodCalledByButtonClick {
  for (id obj in array) {
    [self doSomethingWithObj:obj];
  }
}

static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
  if (isBad) {
    return;
  }
  if ([obj isBad]) {
    isBad = YES;
    [self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
    return;
  }
  //Do something with obj
}

- (void) resetIsBad {
  isBad = NO;
}

Esta garantizado que-resetIsBad no se llamará hasta después-methodCalledByButtonClick devuelve, asumiendo que estamos ejecutando en el hilo principal, incluso si-methodCalledByButtonClick Toma un tiempo arbitrariamente largo para completar?

Respuestas a la pregunta(2)

Su respuesta a la pregunta