在不同的函数中使用变量? Objective-C的

时间:2013-04-01 02:48:56

标签: objective-c

我正在尝试使用randX和randY来自 - (void)awakeaccelerometer里面的第二个函数 - (void)加速度计..程序无法识别它们。提前谢谢。

-(void) awakeaccelerometer
{
    [[UIAccelerometer sharedAccelerometer]setUpdateInterval:1.0/50.0];
    [[UIAccelerometer sharedAccelerometer]setDelegate:self];

    float randX = arc4random() % 320;
    float randY = arc4random() % 548;

    CGPoint randNewPlace = CGPointMake(randX, randY);
    Rand.center = randNewPlace;

}


//Controlling the accelerometer
-(void) accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration
{
.....

CGRect blockRect = CGRectMake(newX, newY, 20, 20);
CGRect targetRect = CGRectMake(randX, randY, 20, 20);

    if (CGRectIntersectsRect(blockRect, targetRect))
    {
        float tnewX = arc4random() % 320;
        float tnewY = arc4random() % 548;

        CGPoint randNewPl = CGPointMake(tnewX, tnewY);
        Rand.center = randNewPl;
    }


}

1 个答案:

答案 0 :(得分:2)

您无法理解变量的生命周期范围。变量的生命周期是它存在并且可以包含值的时间段。变量的范围是可以访问变量的代码范围。变量可以存活但超出范围(但反之亦然)。

局部变量randXrandY的生命周期来自他们使用方法awakeaccelerometer的声明,直到创建它们的awakeaccelerometer的特定调用返回。这两个变量的范围是从声明点到方法结束的代码。当在CGMakePoint内调用awakeaccelerometer时,randXrandY两个变量保持活跃但超出范围 - CGMakePoint中的任何代码都无法引用它们

两个变量randXrandY不在accelerometer:didAccelerate:范围内。

您的问题的答案是,如果您希望这两个变量可用于这两个方法,那么您需要将它们提升到封闭范围,以便它们在两个方法中都是活动的并且在范围内。通常的建议是将它们提升为实例变量(在@interface@implementation的开头在一个支撑块内声明) - 实例变量的生命周期是与封闭对象相同,范围至少包括该对象的所有实例方法。

但是你真的需要理解为什么会这样,这是否是你需要的,这些是任何语言编程的基础,你应该阅读并理解它们。在SO上尝试搜索“[objective-C]范围生命周期”,你会得到很多点击。如果你放弃“[objective-C]”,你会得到更多关于其他语言讨论主题的内容。在编程(语言概念)的文本中更好看,这里列出的内容太多了!

HTH