-2

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

-(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;
    }


}
4

1 回答 1

2

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

局部变量的生命周期randXrandY从它们与方法的声明点到创建它们awakeaccelerometer的特定调用返回。awakeaccelerometer这两个变量的作用域是从它们的声明点到方法结束的代码。当在两个变量CGMakePoint中进行调用并保持活动状态但超出范围时 - 内部的任何代码都无法引用它们。awakeaccelerometerrandXrandYCGMakePoint

这两个变量randXrandY没有在范围内accelerometer:didAccelerate:

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

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

高温高压

于 2013-04-01T03:37:49.933 回答