¿Cómo se llama esta forma de scoping?

Más o menos por accidente me encontré con esta forma de scope

DataSource *dataSource =({ NSInteger idx = [[self.tableView indexPathForSelectedRow] row]; DataSource *dataSource = [DataSource new]; dataSource.address = self.destinations[idx][0]; dataSource.name = self.destinations[idx][1]; dataSource; }); 

Creo que es una buena forma de crear y crear instancias de objetos y variables, ya que las variables temporales solo vivirán mientras sean necesarias para crear el objeto que realmente necesito y cuido. En el código anterior, idx desaparecerá tan pronto como escriba el dataSource interior en la dataSource de datos externa, ya que el scope se abandonará poco después.
También encuentro atractivo el hecho de que un objeto completamente instanciado y configurado se establezca en el objeto externo.
En realidad, ni siquiera sé si esta es una característica C o Objective-C o un dulce de syntax agregado al clang.


@Unheilig
esta es una syntax para organizar el código. no es algo así como un locking o cierre. al final del código, solo tiene un objeto completamente instanciado y configurado.

Esto es útil si necesita un objeto solo para pasarlo como argumento a un método, pero la configuración de ese objeto toma más de una statement. En lugar de asignarlo a una variable temporal local, puede pasar una expresión de statement.

 [[MYViewController alloc] initWithDataSource:({ NSInteger idx = [[self.tableView indexPathForSelectedRow] row]; DataSource *dataSource = [DataSource new]; dataSource.address = self.destinations[idx][@"address"]; dataSource.name = self.destinations[idx][@"name"]; dataSource; })]; 

En un entorno que no sea ARC, incluso podría llamar a la liberación automática dentro de la statement de expresión.

Por lo tanto, supongo que se trata de la organización del código y de un gran gusto personal.

Es una extensión de GCC, llamada “expresión de statement”, que se describe en http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html .