objective c - Colocación del asterisco en Objective-C
pointers (14)
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 declaración válida, realmente no hace nada por sí misma.
$ cat foo.m
#include <Cocoa/Cocoa.h>
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
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 intento 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 absolutamente ninguna diferencia entre estos.
No hay absolutamente ninguna diferencia. NSString * mystring y NSString * myString son idénticos.
No hay diferencia, donde el *
se coloca en una declaración de puntero es irrelevante.
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 declaración de tipo.
No hay diferencia, la colocación del espacio en blanco es irrelevante.
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;
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 share y https://.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.
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/
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];
}
en realidad, todo es equivalente: ¡un puntero a un nsstring!
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 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 sintaxis 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.
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 sintaxis 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 sintaxis relevante está delimitada por caracteres que no sean de espacios en blanco (por ejemplo, {
, }
, ;
, etc.) [1].
3 es una NSString*
tipo (indicando al compilador 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 sintaxis 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 declaración, 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 declaración 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.