2010-04-06 10 views
18

Estoy mirando un código fuente de un tercero y estoy viendo repetidamente una sintaxis que es nueva para mí. Básicamente, están separando las declaraciones con comas en lugar de punto y coma. Compila y funciona, pero no entiendo lo que está haciendo. Parece que por loEn Objective-C, ¿qué hace una coma cuando se usa como un separador de instrucciones?

if(url)[url release], url = nil; 

y también usarlo sin el si a veces

[url release], url = nil; 

¿Qué está pasando aquí?

+0

Esto no es útil en esta situación y sólo hace que sea más difícil de leer. Donde podría ser útil es si alguna asignación tuviera que suceder con dos variables con una versión, como: var1 = [var2 release], var2 = nil; pero incluso en este caso, un bloque lo haría mucho más limpio, mucho más fácil de leer y mucho más fácil de depurar. –

+1

Estamos de acuerdo con la falta de claridad del primer ejemplo, pero el segundo no es tan malo en una implementación de dealloc, aunque un punto y coma en lugar de una coma podría hacer más o menos lo mismo. Me resulta más fácil de leer para una larga lista de lanzamientos, porque no tiene líneas alternas haciendo dos cosas diferentes. Semánticamente, liberar un objeto y configurarlo en cero son como una sola operación (o deberían serlo si quieres evitar zombis). –

Respuesta

15

Como en C y C++, el operador de coma calcula la cosa en su lado izquierdo y luego calcula la cosa a la derecha; el valor total de la expresión es el valor del lado derecho. Básicamente, esto permite que una sola expresión haga dos cosas (la del lado izquierdo es presumiblemente para efectos secundarios, como una llamada o asignación de método). Sí, la sintaxis es un tanto ambigua con la utilizada en llamadas a funciones y declaraciones de variables.

Prefiero usar un bloque honesto que contenga varias declaraciones siempre que sea posible. Más largo, pero en última instancia más limpio. Más fácil de depurar también.

+0

Estoy totalmente de acuerdo con Donal, especialmente para este tipo de cosas. No usar un bloque aquí es simplemente flojo y más difícil de leer. –

+0

Gracias. Me aseguraré de evitar usarlo para este propósito en mi propio código. Sin embargo, me alegra saber que puedes hacer esto ahora. Podría ser útil en otro lugar. –

+0

Totalmente de acuerdo con Donal en el uso de declaraciones múltiples en lugar de esta sintaxis. – skantner

3

Estas son expresiones separadas por comas y se evalúan de izquierda a derecha, con el resultado de que la expresión completa es la última expresión evaluada.

2

Ésta es una de mis favoritas "características" de C, ObjC, etc ...

La comprensión de este operador abre todo tipo de posibilidades para jQuery-like.chain-able.commands y una forma más concisa (thoug-alguna-le-discutir-menos legible) expresión de expresiones idiomáticas comunes MUCHAS .. Por ejemplo ...

-(id)init { 
    return self != super.init ? nil : [self setProperty:@"EPIC"], 
    NSLog(@"One line inits are: %@.", _property), self;  } 

REGISTRO ➜One line inits are: EPIC.

+4

Le doy una bofetada a alguien en una revisión de código para esto. Personalmente me resulta muy difícil de leer e innecesario. Pero esa es solo mi opinión. –

+1

Soy un blanco notorio para muchos de estos "ataques de bofetada" ... pero, por desgracia, muchos lo han intentado, y la mayoría han fallado, para dar un "Me gusta" a mí mismo por cosas como "esto", suspiro. –

+1

En aras de la claridad y la simplicidad, le aconsejo que evite escribir este método init. – Dustt

Cuestiones relacionadas