Ios 具有全局变量的Objective-C问题:rfduino/spritebuilder

Ios 具有全局变量的Objective-C问题:rfduino/spritebuilder,ios,objective-c,spritebuilder,rfduino,Ios,Objective C,Spritebuilder,Rfduino,我正在尝试构建一个包含SpriteBuilder和RFduino的项目,但在iOS/XCODE中协调这两个项目时遇到了困难。我有一个方法,checkDevice,看起来像这样: NSLog(@"Checking device: %@", rfduino); NSLog(@"Physics node: %@", _physicsNode); if (rfduino.advertisementData){ NSString *advertising = @""; if (rfduin

我正在尝试构建一个包含SpriteBuilder和RFduino的项目,但在iOS/XCODE中协调这两个项目时遇到了困难。我有一个方法,checkDevice,看起来像这样:

NSLog(@"Checking device: %@", rfduino);
NSLog(@"Physics node: %@", _physicsNode);
if (rfduino.advertisementData){
    NSString *advertising = @"";
    if (rfduino.advertisementData) {
        advertising = [[NSString alloc] initWithData:rfduino.advertisementData encoding:NSUTF8StringEncoding];
        NSLog(@"advertisement: %@", advertising);
    }

    int numLargeParticles = [[advertising substringToIndex:4] intValue];
    int numSmallParticles = [[advertising substringFromIndex:4] intValue];

    [self updateLargeParticles:numLargeParticles andSmallParticles:numSmallParticles];
}
else {
    NSLog(@"no connected rfduino found");
}

//recursive so always checking
[self performSelector:@selector(checkDevice) withObject:nil afterDelay:PARTICLE_CHECKING_DELAY];
rfduino变量是从另一个类ScanViewController设置的,而_physicsNode是在创建CCB文件时设置的。方法updateLargeParticles:andSmallParticles基本上从rfduino广告中获取数据,并使用它向physicsNode添加节点

根据调用checkDevice的位置,这两个变量中的一个为null

如果我在didLoadFromCCB的末尾调用[self-checkDevice],rfduino变量始终为空,即使在其他日志语句显示变量已成功设置的后续递归调用之后也是如此

如果我在设置rfduino变量的方法末尾调用[self-checkDevice],则即使在后续递归调用之后,_physicsNode也始终为空

我认为我误解了全局变量,并且它们没有在多个方法中持续存在。如有任何见解,我将不胜感激,我将非常乐意提供更多信息/代码/等

以下是日志输出的示例:

未找到RFduino。从didLoadFromCCB调用的ie方法:

ParticlesPhysics[695:86622] Checking device: (null)
ParticlesPhysics[695:86622] Physics node: <CCPhysicsNode = 0x13d62d5d0 | Name = >
ParticlesPhysics[695:86622] no connected rfduino found
然后在主场景中合成

@synthesize rfduino;
@synthesize _physicsNode;
我尝试在实现中声明它们,如下所示,但这会导致相同的错误

@implementation MainScene{
    CCPhysicsNode *_physicsNode;
    RFDuino *rfduino;
    CCNode *_bottomBorder;
    CCEffectBrightness *_brightnessEffect;
    CCEffectStack *_effectStack;
    CCLabelTTF *_largeLabel;
    CCLabelTTF *_smallLabel;
}
通过以下方法设置rfduino

(void) log:(RFduino *)rfduino_instance {
rfduino = rfduino_instance;
NSLog(@"log: rfduino is %@", rfduino);

[self checkDevice];
}
它是从ScanViewController类调用的

(void)didConnectRFduino:(RFduino *)rfduino
{
NSLog(@"didConnectRFduino");

[rfduinoManager stopScan];
loadService = false;

MainScene *mainScene = [MainScene alloc];
[mainScene performSelector:@selector(log:) withObject:rfduino afterDelay:1.0];      //initial delay to give time for setup

}
physicsNode不是以编程方式显式声明的,而是在SpriteBuilder中创建的

谢谢大家!!
C

我们可以看到声明rfduino和_physicsNode的代码,以及设置它们的代码吗?我怀疑问题出在checkDevice中。如果rfduino是一个成员变量?如果是这样,只要它所属的对象处于活动状态,它就会保持其值。也许你创建了两个类实例?@MichaelL这些变量是在MainScene中定义的,所以我认为它们是该类的成员,但在我的应用程序中只有一个MainScene和一个Scene CCNode,所以我不确定这会是什么问题。
(void) log:(RFduino *)rfduino_instance {
rfduino = rfduino_instance;
NSLog(@"log: rfduino is %@", rfduino);

[self checkDevice];
}
(void)didConnectRFduino:(RFduino *)rfduino
{
NSLog(@"didConnectRFduino");

[rfduinoManager stopScan];
loadService = false;

MainScene *mainScene = [MainScene alloc];
[mainScene performSelector:@selector(log:) withObject:rfduino afterDelay:1.0];      //initial delay to give time for setup

}