我正在尝试使用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;
}
}
答案 0 :(得分:2)
您无法理解变量的生命周期和范围。变量的生命周期是它存在并且可以包含值的时间段。变量的范围是可以访问变量的代码范围。变量可以存活但超出范围(但反之亦然)。
局部变量randX
和randY
的生命周期来自他们使用方法awakeaccelerometer
的声明,直到创建它们的awakeaccelerometer
的特定调用返回。这两个变量的范围是从声明点到方法结束的代码。当在CGMakePoint
内调用awakeaccelerometer
时,randX
和randY
两个变量保持活跃但超出范围 - CGMakePoint
中的任何代码都无法引用它们
两个变量randX
和randY
不在accelerometer:didAccelerate:
范围内。
您的问题的答案是,如果您希望这两个变量可用于这两个方法,那么您需要将它们提升到封闭范围,以便它们在两个方法中都是活动的并且在范围内。通常的建议是将它们提升为实例变量(在@interface
或@implementation
的开头在一个支撑块内声明) - 实例变量的生命周期是与封闭对象相同,范围至少包括该对象的所有实例方法。
但是你真的需要理解为什么会这样,这是否是你需要的,这些是任何语言编程的基础,你应该阅读并理解它们。在SO上尝试搜索“[objective-C]范围生命周期”,你会得到很多点击。如果你放弃“[objective-C]”,你会得到更多关于其他语言讨论主题的内容。在编程(语言概念)的文本中更好看,这里列出的内容太多了!
HTH