Colocación del asterisco en Objective-C

Acabo de comenzar a aprender Objective-C, proveniente de un fondo .Net y C # .Net de VB. Entiendo el uso del puntero, pero en los ejemplos de Objective-C veo el asterisco colocado en varios lugares diferentes, y si busco como sea posible, no he podido encontrar una respuesta sobre por qué. Cada búsqueda que bash presenta todo tipo de explicaciones sobre punteros (que realmente no necesito), pero ni una sola mención de los motivos / efectos de las diferentes ubicaciones del asterisco. Aquí hay algunos ejemplos que he visto:

NSString *string; NSString * string; (NSString *) string; NSString* string; 

¿Qué significan estas diferentes posiciones del asterisco? Estoy seguro de que es una respuesta simple, pero es frustrante no poder encontrarla en ningún tutorial de Apple ni en la documentación de referencia, ni en línea hasta el momento.

¿Puede alguien por favor terminar con mi miseria y responder a esta pregunta desconcertante? ¡Gracias!

No hay diferencia, sin embargo, debe tener en cuenta que solo el primer “token” (por así decirlo) define el nombre del tipo, y el * no es parte del nombre del tipo. Es decir:

 NSString *aString, bString; 

Crea un puntero a NSString y un NSString . Para que ambos sean punteros, haz lo siguiente:

 NSString *aString, *bString; 

o:

 NSString *aString; NSString *bString; 
 1. NSString *string; 2. NSString * string; 3. (NSString *) string; 4. NSString* string; 

1, 2 y 4 son exactamente idénticos. Todo es estilo Elija lo que quiera, o mezcle todo.

La opción # 3 tiene otro significado también, se usa en el casting. Por ejemplo:

 t = (NSString *)string ; 

lanzará string a un puntero NSString .

Pero la opción n. ° 3 es la syntax que probablemente usaría en un archivo .h o en la definición de la función en un archivo .m. Dentro de una función real, en el código que se “ejecuta” tiene un significado diferente.

No hay diferencia, es una cuestión de estilo. Todos declaran una variable llamada string que es un puntero a un NSString. Los paréntesis son necesarios en algunos contextos (en particular las declaraciones de métodos) para aclarar que se trata de una statement de tipo.

no importa dónde coloque el asterisco, todas las declaraciones crean punteros de tipo NSString.

sin embargo, al usar múltiples nombres de variables en una línea, debe escribir el asterisco para cada variable.

 NSString * nsstring, * nsstring2; 
 1. NSString *string; 2. NSString * string; 3. (NSString *) string; 4. NSString* string; 

1,2 y 4 son equivalentes. El lenguaje C (y el superconjunto Objective-C de C) especifican una syntax que no es sensible al espacio en blanco. Por lo tanto, puede agregar libremente espacios donde elija como una cuestión de estilo. Toda la syntax relevante está delimitada por caracteres que no sean de espacios en blanco (por ejemplo, { , } , ; , etc.) [1].

3 es una NSString* tipo (indicando al comstackdor de C que use el tipo NSString* independientemente del tipo de string declarada. En Objective-C, el tipo de conversión de instancias de objeto raramente es necesario. Puede usar el tipo de id para las variables que pueden referenciar instancias de cualquier tipo de objeto.

En las declaraciones de métodos, la syntax 3 (a veces sin el punto y coma final) se utiliza para declarar el tipo de parámetros del método. Un método Objective-C puede verse así:

 - (void)myMethodThatTakesAString:(NSString*)string; 

En esta statement, el tipo de argumento denominado string es tipo NSString* (el encabezado - indica un método de instancia como opuesto a un método de clase). Una statement de método con más de un parámetro podría verse así:

 - (void)myMethodTakingAString:(NSString*)string andAnInteger:(NSInteger)intParam; 

[1] Esto se compara con lenguajes como Python que usan espacios en blanco como un delímetro de bloque.

No hay diferencia, donde el * se coloca en una statement de puntero es irrelevante.

No hay diferencia, la colocación del espacio en blanco es irrelevante.

No hay absolutamente ninguna diferencia. NSString * mystring y NSString * myString son idénticos.

en realidad, todo es equivalente: ¡un puntero a un nsstring!

el * funciona de la misma manera que en el estándar C.

este es un buen manual para poner el * en diferentes lugares y lo que hace: http://boredzo.org/pointers/

No hay absolutamente ninguna diferencia entre estos.

1, 2 y 4 son equivalentes y definen un puntero a un NSString. Mi preferencia personal es emular K & R tanto como sea posible, así que me gusta usar NSString *string;

(NString*)string; aunque es una statement válida, realmente no hace nada por sí misma.

 $ cat foo.m #include  void foo() { NSString *string; (NSString*) string; // doesn't do anything 42; // doesn't do anything either } $ gcc -Wall -c foo.m foo.m: In function 'foo': foo.m:7: warning: statement with no effect foo.m:8: warning: statement with no effect 

en el código de muestra de la documentación de xcode4, puede ver 3. todo el tiempo, por ejemplo, en MoveMeView.m

 #if 1 - (void)growAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { #define MOVE_ANIMATION_DURATION_SECONDS 0.15 [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:MOVE_ANIMATION_DURATION_SECONDS]; placardView.transform = CGAffineTransformMakeScale(1.1f, 1.1f); /* Move the placardView to under the touch. We passed the location wrapped in an NSValue as the context. Get the point from the value, then release the value because we retained it in touchesBegan:withEvent:. */ NSValue *touchPointValue = (NSValue *)context; placardView.center = [touchPointValue CGPointValue]; [touchPointValue release]; [UIView commitAnimations]; } 

Puede que no haya diferencias en las alternativas 1, 2 y 4 para la computadora, pero existen otros lectores del código.

Dado que las explicaciones como https://stackoverflow.com/a/1521382 y https://stackoverflow.com/a/16040884 y https://www.tutorialspoint.com/objective_c/objective_c_pointers.htm usan la primera alternativa:

1. NSString *string;

y todas las variables adicionales necesitan su propio asterisco como en:

NSString *aString, *bString;

Mi humilde sugerencia es que usemos la alternativa 1 como estándar.