dispatch_sync llamar a una llamada dispatch_async

Tengo algunas dudas sobre el comportamiento de este código:

dispatch_async(queue, ^{
    sleep(2);
    NSLog(@"step1");

    dispatch_sync(queue, ^{
        sleep(3);
        NSLog(@"step 2");
    });

    NSLog(@"step 3");
});

De estas filas esperaba obtener como salidastep1 -> step3 -> step2 pero obtengo solostep1.

Si cambio dispatch_sync con dispatch_async funciona como se esperaba, ¿dispatch_sync en una llamada dispatch_async crea este tipo de problema?

Editar después de las respuestas ----------------

Este caso crea un punto muerto:

Puede verificar la respuesta aceptada para tener una explicación de esta situación y consultar este enlace para obtener documentaciónhttp: //developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.htm

Respuestas a la pregunta(4)

Su respuesta a la pregunta