2010-01-14 14 views
5

En el siguiente código:¿"LValue" no significa lo que creo que significa?

_imageView.hasHorizontalScroller = YES; 
_imageView.hasVerticalScroller = YES; 
_imageView.autohidesScrollers = YES; 

NSLog(@"scrollbar? H %p V %p hide %p", 
     &(_imageView.hasHorizontalScroller), 
     &(_imageView.hasVerticalScroller), 
     &(_imageView.autohidesScrollers)); 

estoy recibiendo el error:

Controller.m:143: error: lvalue required as unary '&' operand 
Controller.m:144: error: lvalue required as unary '&' operand 
Controller.m:145: error: lvalue required as unary '&' operand 

en cuenta que estoy usando esas variables como lvalues ​​directamente ante los & líneas ...

Cómo ¿Puede quejarse de que un valor no es un valor justo después de asignarlo sin error? ¿Tiene esto que ver con los getters/setters mágicos que crea el objetivo C?

Creo que necesito para explicar un poco de contexto para explicar por qué estoy tratando de obtener la dirección:

en mi post anterior es así, me mostró el mismo código, impresión% d y encontrar que después de las asignaciones, las propiedades seguían siendo 0 por alguna razón. Por lo tanto, pensé que trataría de obtener las direcciones de las propiedades para ver dónde están siendo almacenadas y quizás pueda descubrir por qué no las estoy asignando con éxito, y luego sucedió.

Creo que como la gente ha mencionado, sí, es probable que cuando hago la asignación obj-c secretamente reemplaza eso con una llamada al colocador (y luego otra magia porque en otra publicación SO, alguien más mencionó que

BOOL b = [_imageView setHasVerticleScroller: YES] 

falla, pero

BOOL b = _imageView.hasVerticalScroller = YES; 

funciona bien.

+0

Sólo por curiosidad, pero ¿por qué se desea imprimir la dirección de memoria? – swegi

+0

Estoy tratando de averiguar por qué los valores son todos 0 después de las asignaciones, y esperaba que saber DONDE estaban ayudaría ... –

Respuesta

2

_imageView.hasHorizontalScroller = YES; - en esta línea se accede a la propiedad en imageView - por lo no accedes al valor, pero llama al setter método:

[_imageView setHasHorizontalScroller:YES]; // Equivalent of your code. 

En el segundo ejemplo, también accede a la propiedad, pero este método getter se llama y devuelve BOOL. Entonces, como señala mipadi, no necesita usar & en esa declaración NSLog.

Sugeriría leer documentos sobre properties en obj-c.

Editar:here se encuentra la discusión acerca de qué propiedades funcionan en múltiples sentencias de asignación, como usted ha mencionado:

BOOL b = _imageView.hasVerticalScroller = YES; 
+1

así que, básicamente, estás diciendo "Sí, son los buscadores/incubadores mágicos" ... –

+0

básicamente, sí :) – Vladimir

3

no estoy 100% seguro, pero voy a tomar una puñalada en la respuesta.

Esas propiedades son todas BOOL tipos, que es (creo) un unsigned char en Objective-C. (Tal vez un int, no recuerdo, pero es algo así.) Por lo tanto, está intentando tomar la dirección de (&) esas propiedades. Pero en realidad no estás accediendo a los ivars directamente; las propiedades pasan por una llamada a método para obtener sus valores. Así que está tratando de obtener la dirección del valor de retorno BOOL de un método, pero como en realidad no está asignando el valor a, no hay una dirección; solo tiene el valor.

Tendrías el mismo problema si usted hizo esto:

static int returnOne(void) 
{ 
    return 1; 
} 

// Later... 

NSLog(@"returnOne is %p", &returnOne()); // Oops, the return value of returnOne has no address! 

Su registro de llamadas debería tener este aspecto:

NSLog(@"scrollbar? H %d V %d hide %d", 
    _imageView.hasHorizontalScroller, 
    _imageView.hasVerticalScroller, 
    _imageView.autohidesScrollers); 
+0

mi llamada de registro no está realmente tratando de mostrar los VALORES. Quiero las ubicaciones, como un paso de depuración ... Ya sé que los valores son todos 0, y estoy tratando de averiguar por qué ... –

+1

Correcto, pero el punto es que los valores no tienen una dirección - - no tienen ubicación - ya que solo están siendo devueltos por una llamada de método y no se están asignando. Las propiedades son en realidad * llamadas a métodos *: no está accediendo a la variable en sí. – mipadi

+0

Bueno, eso plantea la pregunta de por qué funcionan las asignaciones encadenadas ... pero ese puede ser otro caso especial ... –

Cuestiones relacionadas