Получение переменной из другого класса НЕ работает - PullRequest
0 голосов
/ 16 декабря 2011

Могу ли я получить переменную из другого класса, если я сделаю это так:

---------------------------- HelloWorldLayer.h ---------------- ---------------

@interface HelloWorldLayer : CCLayer
{  

...
BOOL win;
...
}

@property (nonatomic,readwrite) BOOL win;

---------------------------- HelloWorldLayer.m ---------------- ---------------

@synthesize win;

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (...){

  //do something with with variable win ----> IN <---- if statement
  win = YES;
  }
//win is changed only in if statement
}

---------------------------- LevelDone.m ---------------- ---------------

-(void)nextLevel:(id)sender{
    NSLog(@"next level");

    HelloWorldLayer *obj = [[HelloWorldLayer alloc]init];
    if (obj.win==YES){
        NSLog(@"win = YES");
    }else {
        NSLog(@"win = NO");
    }
    win = NO;
    [[CCDirector sharedDirector] popScene];

}

Могу ли я сначала получить и установить переменную win здесь, чтобы другой класс теперь имел переменную win, назначенную с NO, или присвоение win в операторе if не обрабатывается глобально?

если я присваиваю переменную NO в методе init и изменяю ее в функции, она будет принимать только значение, назначенное в методе init ... ПОЧЕМУ ЧТО ТАКОЕ АД?

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

если я назначу переменную NO в методе init и изменим ее в функция будет принимать только то значение, которое было назначено в метод init ... ПОЧЕМУ АД, ЧТО ЭТО?

Поскольку вы не используете один и тот же объект, вы создаете новый :

HelloWorldLayer *obj = [[HelloWorldLayer alloc]init];
    if (obj.win==YES){
        NSLog(@"win = YES");
    }else {
        NSLog(@"win = NO");
    }

Каждый раз, когда вы запускаете эту строку кода:

HelloWorldLayer *obj = [[HelloWorldLayer alloc]init];

… вы создаете новый экземпляр HelloWorldLayer. Он запустит код в методе init, потому что вы отправляете ему сообщение init. Вот почему любое значение, установленное вами в методе init, будет записано в приведенном выше коде.

Вам нужно получить доступ к существующему экземпляру HelloWorldLayer, а не создавать новые экземпляры класса. Я думаю, что @ Джереми дал вам удовлетворительное решение для этого. Другим способом было бы превратить класс HelloWorldLayer в одноэлементный.

0 голосов
/ 16 декабря 2011

Это пример путаницы между использованием методов доступа, генерируемых @synthesize, и прямой ссылкой на переменную экземпляра.Попробуйте объявить вашу собственность следующим образом:

---------------------------- HelloWorldLayer.h -------------------------------

@interface HelloWorldLayer : CCLayer

@property (nonatomic) BOOL win;

---------------------------- HelloWorldLayer.m -------------------------------

@synthesize win=_win;

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  if (...){
      self.win = YES;
  }

}

Я думаю, что значения BOOL всегда по умолчанию равны False , поэтому вам действительно не нужно устанавливать его в init (), если вы не хотите, чтобы оно по умолчанию было True .

В любом случае, теперь переменная экземпляра установлена ​​в _win в вашем классе HelloWorldLayer.Всякий раз, когда вы хотите установить его, всегда называйте его как self.win.При работе со свойствами это безопасная привычка, гарантирующая, что вы не столкнетесь с утечками памяти, потому что когда вы имеете дело с указателями, сгенерированные средства доступа будут освобождаться и сохраняться для вас.Если вы устанавливаете переменную экземпляра напрямую, вы должны помнить, чтобы сначала освободить ее.

Надеюсь, это поможет!

0 голосов
/ 16 декабря 2011

Вы можете рассмотреть возможность использования протокола. Таким образом, LevelDone получит уведомление о том, выиграл ли HelloWorldLayer. Особенно, если, возможно, HelloWorldLayer - это длительный процесс, работающий асинхронно. Вот грубый пример:

HelloWorldLayer.h

@protocol HelloWorldLayerDelegate
- (void)helloWorldLayer:(HelloWorldLayer *)layer didWin:(BOOL)win;
@end

@interface HelloWorldLayer : CCLayer
{  

...
BOOL win;
...
}

@property (nonatomic,readwrite) BOOL win;
@property (nonatomic, assign) id <HelloWorldLayerDelegate>delegate;

@end

HelloWorldLayer.h

@implementation HelloWorldLayer 
@synthesize win;
@synthesize delegate;

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
  if (...){

  //do something with with variable win ----> IN <---- if statement
  win = YES;

     [self.delegate helloWorldLayer:self didWin:win];


  }
//win is changed only in if statement
}

@end

LevelDone.h

@interface LevelDone <HelloWorldLayerDelegate>
    HelloWorldLayer *_hello;
@end

LevelDone.m

@implementation LevelDone

- (void)playLevel {

    _hello = [HelloWorldLayer alloc] init];
    _hello.delegate = self;

    [_hello start];

}

- (void)helloWorldLayer:(HelloWorldLayer *)layer didWin:(BOOL)win {

    //Rather than having a didWin: parameter, maybe you can just check the property of the layer object

    NSLog(@"win = %@", win ? @"YES" : @"NO");


    [[CCDirector sharedDirector] popScene];

}

- (void)dealloc {
  [_hello release];
  [super dealloc];
}

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