Доступ к значению переменной класса из другого - target-c - PullRequest
2 голосов
/ 21 февраля 2012

Это, наверное, глупый вопрос, но я с трудом пытаюсь его решить.Дело в том, что у класса есть класс, который реализует счетчик, а в конце процедуры он вызывает представление, управляемое другим классом.Я хотел бы получить доступ к значению счетчика первого класса из второго.Я определил счетчик как свойство и попытался получить к нему доступ из другого класса, но всегда получаю его значение равным 0. Может ли кто-нибудь мне помочь?

спасибо.

Что у меня есть, так это:

Class1.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];
    }
}

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Ваша проблема в том, что вы создаете новый экземпляр Class1 в вашем методе инициализации Class2:

Class1 *theClass1 = [[Class1 alloc] init];

Этот новый экземпляр является дополнением к экземпляру с int youуспешно увеличивается, и, поскольку это свежий кусок памяти, его значение для moveCounter по-прежнему равно 0. Что вам действительно нужно, так это указатель на конкретную копию Class1, с которой вы работали, - не требуется alloc / initили желательно.Попробуйте создать свойство в Class2, которое может содержать указатель на Class1:

#import "Class1.h"

@interface Class2 : NSObject {
    Class1 *myPointerToClass1;
}
@property (nonatomic, retain) Class1 *myPointerToClass1;

И, конечно, @synthesize myPointerToClass1 в .m класса2.Теперь, когда Class2 готов содержать указатель на Class1, вам нужно просто заполнить его.В Class1, после кода, который размещает и инициализирует экземпляр Class2, используйте код, подобный следующему:

myClass2.myPointerToClass1 = self;

Просто чтобы убедиться, что я ничего не забыл, я сделал все это, используя ваш код выше, и все работало простохорошо для меня. РЕДАКТИРОВАТЬ: оригинальный ответ начинается здесь, но теперь не имеет значения ..... Вы упомянули, что определили счетчик как свойство, но также вы синтезировали переменную экземпляра в файле своей реализации (.m)?

@synthesize myCounter;

Это автоматически создаст методы установки и получения.Кроме того, вы убедились, что значение увеличивается вообще, возможно, с помощью оператора NSLog в viewcontroller?

NSLog(@"myCounter is currently equal to %d", myCounter); // assuming an int

Если эти основы описаны, возможно, вы могли бы отредактировать свой вопрос, включив в него код, показывающий намподробнее о том, как плохо ведущий класс получает этот указатель на переменную.

1 голос
/ 21 февраля 2012

В вашем заголовочном файле вы объявляете iVar как

{
    int movesCounter;
}

, но вы синтезируете свойство с

@synthesize movesCounter = _movesCounter; // note the underscore

, поэтому movesCounter iVar не подключается к movesCounter имущество.Если вы обновляете только movesCounter вместо self.movesCounter или _movesCounter, то внешние классы не смогут увидеть эти изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...