2011-11-04 19 views
16

tengo una variable declarada en el archivo de cabecera:instancia de variable 'variable' visitada por error método de clase

@interface

int _nPerfectSlides; 

y

@property (nonatomic, readwrite) int _nPerfectSlides; 

y tengo un método que Declaré en el encabezado:

+ (void) hit; 

El método tiene el siguiente código en él:

+ (void) hit { 
    NSLog(@"hit"); 
    _nPerfectSlides = 0; 
    [_game showHit]; 
} 

ahora por alguna razón, me sale el error "visitada en el método de clase variable de instancia '_nPerfectSlides'" error y parece que no puedo acceder a ninguna de las variables dentro del método . ¿Qué estoy haciendo mal?

Respuesta

20

Si pretendía hacer de esto un método de instancia, cambie ese + a -.

+0

Sí, lo intenté antes de publicar, se arregló este problema, pero cuando intento llamar al método de otra clase, se bloquea ... ¿qué debo hacer? –

+5

Crea una instancia de la clase y llama al método de instancia en esa instancia ... – Arkku

+6

Parece que no has comprendido los conceptos básicos de OOP. ¿Has asimilado documentos como este? http://www.otierney.net/objective-c.html – Cyrille

7

Una variable de instancia es, como su nombre indica, solo accesible en los métodos de instancia (aquellos declarados con -). Los métodos de clase (declarados con +) no tienen acceso a la variable de instancia, no más de lo que tienen acceso al objeto self.

+0

bien, entonces, ¿cómo puedo crear un método de clase para acceder a él desde otras clases mientras tengo acceso a las variables de instancia? –

+3

No entiendo tu comentario. O cambias tu '+ (void) hit' en un' - (void) hit', o declaras '_nPerfectSlides' en un nivel global, fuera de tu clase' '@ interface'. – Cyrille

17

1. Para+ (void)hit: Solo tiene acceso al objeto self.

- Paso 1: Quitar follwing línea de archivo de cabecera

@property (nonatomic, readwrite) int _nPerfectSlides; 

- Paso 2:

  • Añadir int _nPerfectSlides en el archivo de clase a nivel mundial ..
  • Eso significa declarar antes de @implementation

Ej: En .m File

#import "Controller.h" 
int _nPerfectSlides // Add like this before @implementation 

@implementation Controller 

2. Para- (void)hit: sólo tienen acceso a los métodos de instancia

3

Sé que esto es viejo, pero todavía aparece. Intenta hacerlo estático. Aquí estoy alterando el código un poco para que se incremente.

// Hit.h 

#import <Foundation/Foundation.h> 
@interface Hit : NSObject 
+ (void)hit; 
@end 

// Hit.m 

#import "Hit.h" 
@implementation Hit 
static int val = 0; 
+ (void)hit { 
    val += 1; 
    [self showHit]; 
} 
+ (void)showHit { 
    NSLog(@"hit value: %d", val); 
} 
@end 

//main.m 

#import <Foundation/Foundation.h> 
#import "Hit.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     [Hit hit]; 
     [Hit hit]; 
     [Hit hit]; 
    } 
    return 0; 
} 
Cuestiones relacionadas