2011-03-17 5 views
45

que estoy recibiendo esta advertencia cuando estoy llamando a una rutina local.Xcode "Resultados de acceso a la propiedad no utilizada - captadores no deben utilizarse para los efectos secundarios"

Mi código es la siguiente:

-(void)nextLetter { 
    // NSLog(@"%s", __FUNCTION__); 
    currentLetter ++; 
    if(currentLetter > (letters.count - 1)) 
    { 
     currentLetter = 0; 
    } 
    self.fetchLetter; 
} 

me estoy haciendo la advertencia en la declaración self.fetchLetter.

que se ve de rutina como esta:

- (void)fetchLetter { 
    // NSLog(@"%s", __FUNCTION__); 
    NSString *wantedLetter = [[letters objectAtIndex: currentLetter] objectForKey: @"langLetter"]; 

    NSString *wantedUpperCase = [[letters objectAtIndex: currentLetter] objectForKey: @"upperCase"];  


..... 
} 

que prefiere solucionar los mensajes de advertencia, ¿existe una mejor manera de escribir esto?

Gracias!

Respuesta

105

La notación de puntos (es decir self.fetchLetter) se entiende por propiedades, no para métodos arbitrarios. El self.fetchLetter se interpreta como "obtener la propiedad 'fetchLetter' de 'self'," que no es lo que pretendes.

sólo tiene que utilizar [self fetchLetter] lugar.

+0

Gracias Tom, lo entiendo! Aprecio la claridad. –

+0

Esta solución ya no se aplica en Xcode 6.3 (beta) – Dov

+0

@Dov ¿Qué quiere decir? Esto no es una solución. –

4

Estás declarando fetchLetter utilizando la sintaxis de esta manera?

@property (retain) id fetchLetter; 

Eso parece estar mal para lo que estás haciendo. Las propiedades están destinadas a ser accesores variables que (en el caso de getters) no tienen ningún efecto secundario.

Debe declarar fetchLetter como método, así:

- (void) fetchLetter; 

y acceder a ella usando:

[self fetchLetter] 
+0

Hola Chris, declare fetchLetter como sugieres. Ahora he cambiado la declaración a [self fetchLetter] como tú y Tom indicaron. Aprecio la comprensión. –

0

Me acaban de solucionado el problema, en mi caso un proyecto CoreLocation, utilizando tanto respuestas de Tom y Chris -

yo anuncio

@property (strong, nonatomic)CLLocationManager *locationManager; 

e implementado como:

@synthesize locationManager = _locationManager; 
.... 
- (void) dealloc { 
     [self locationManager]; 
} 
11

En las nuevas versiones de Xcode, incluso el [object method]; puede desencadenar la advertencia. Pero a veces necesitamos llamar a una propiedad y descartar el resultado, por ejemplo, al tratar con controladores de vista y debemos asegurarnos de que la vista esté realmente cargada.

Así que estábamos haciendo:

// Ensure view is loaded and all outlets are connected. 
[self view]; 

Esto ahora también desencadena la “acceder a los resultados de la propiedad sin uso - captadores no deben utilizarse para los efectos secundarios” advertencia. La solución es dejar que el compilador sepa que se ha hecho intencionalmente al convertir el tipo de resultado en vacío:

(void)[self view]; 
+0

¡Increíble, gracias! No hubiera pensado en eso – Dov

+0

Usando Xcode 6 y esto no era necesario – MCB

Cuestiones relacionadas