ios - info - Acceder a un valor de la variable de una clase desde otro-objetivo-c
que es uikit ios (2)
Esta es probablemente una pregunta tonta, pero estoy teniendo dificultades para tratar de resolverlo. El problema es que a tiene una clase que implementa un contador y al final de los procedimientos llama a una vista controlada por otra clase. Lo que me gustaría hacer es acceder al valor del contador de la primera clase desde el segundo. Definí el contador como una propiedad e intenté acceder a él desde la otra clase, pero siempre obtengo su valor como 0. ¿Alguien puede ayudarme?
Gracias.
Lo que tengo es esto:
Clase1.h
@interface Class1 : CCLayerColor <UIAlertViewDelegate>
{
int movesCounter;
}
@property int movesCounter;
@end
Class1.m
@implementation Class1
@synthesize movesCounter;
//At this point the counter gets incremented and NSLogging its value correctly
@end
Class2.m
#import Class1.h
@implementation GameOverLayer
-(id) init
{
if( (self=[super init]))
{
Class1 *theClass1 = [[Class1 alloc]init];
NSString *message = [NSString stringWithFormat:@"It took you %d moves.",theClass1.movesCounter];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
}
¿Qué estoy haciendo mal?
En su archivo de encabezado declara su iVar como
{
int movesCounter;
}
pero sintetizas la propiedad con
@synthesize movesCounter = _movesCounter; // note the underscore
por lo que movesCounter
iVar no se conecta a la propiedad movesCounter
. Si está actualizando solo movesCounter
lugar de self.movesCounter
o _movesCounter
, las clases externas no podrán ver estos cambios.
Su problema es que está creando una nueva instancia de Class1 en su método de inicio Class2:
Class1 *theClass1 = [[Class1 alloc] init];
Esta nueva instancia es adicional a la que tiene la int que ha estado incrementando con éxito, y como es una nueva porción de memoria, su valor para movesCounter es 0. Lo que realmente quiere es un puntero a la copia específica de Class1 que usted ha estado trabajando con - no necesita alloc / init o deseado. Intente crear una propiedad en Class2 que pueda mantener su puntero en Class1:
#import "Class1.h"
@interface Class2 : NSObject {
Class1 *myPointerToClass1;
}
@property (nonatomic, retain) Class1 *myPointerToClass1;
Y, por supuesto, @synthesize myPointerToClass1 en el .m de Class2. Ahora que Class2 está lista para mantener un puntero a Class1, simplemente necesita completarlo. En Class1, después del código que alloc''s e init''s son la instancia de Class2, use un código como este:
myClass2.myPointerToClass1 = self;
Solo para asegurarme de no haber olvidado nada, hice todo esto usando tu código anterior y todo funcionó bien para mí.
EDITAR: la respuesta original comienza aquí, pero ahora es irrelevante ..... Menciona haber definido el contador como una propiedad, pero ¿también ha sintetizado la variable de instancia en su archivo de implementación (.m)?@synthesize myCounter;
Esto creará los métodos setter y getter automáticamente para usted. Además, ¿ha verificado que el valor se incrementa en absoluto, quizás con una declaración NSLog en el controlador de vista?
NSLog(@"myCounter is currently equal to %d", myCounter); // assuming an int
Si estos conceptos básicos están cubiertos, tal vez podría editar su pregunta para incluir el código que nos muestra más acerca de cómo la clase que está portando mal está obteniendo este puntero a la variable en primer lugar.