2013-04-01 21 views
-2

我试图从 - (void)awakeaccelerometer里面使用randX和randY函数 - 第二个函数 - (void)加速度计..程序无法识别它们。提前致谢。在不同的功能中使用变量? Objective-C

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


} 
+8

聪明人的话:查找如何[括号](http://aelinik.free.fr/c/ch14.htm)与[类定义(http://developer.apple .com/library/ios /#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html)与[globals](http://stackoverflow.com/questions/3010647/shared-global-variables-in-c)影响变量的范围。 – CodaFi

+1

这是基本的编程知识,在Objective-C上找到一个教程。你正在寻找的是实例变量。 –

+0

所以我的嵌套函数randX和randY将只使用块范围中的同名变量,是否正确? – Apetro

回答

2

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

局部变量的寿命randXrandY是从与方法awakeaccelerometer直到awakeaccelerometer特定调用,它创建它们的回报点声明。这两个变量的范围是从声明点到方法结束的代码。当CGMakePoint的呼叫在awakeaccelerometer内进行时,两个变量randXrandY保持活动但超出范围 - CGMakePoint中的任何代码都无法引用它们。

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

回答你的问题是,如果你想这两个变量可用到这两种方法,那么你需要将其提升到一个封闭的范围,使他们都活着,在这两种方法中的范围。通常的建议是将它们提升到实例变量(其在一个@interface@implementation的开始的支撑块中声明) - 的实例变量的生存期相同的包围对象,并且在该范围包括至少该对象的所有实例方法。

但你真的需要明白这是为什么,以及是否这是你需要什么,这些都是任何语言编程的基础,你应该阅读并了解他们。在所以尝试搜索“[objective-C]范围生命周期”,你会得到不少点击。如果你放下“[objective-C]”,你会得到更多的话题,因为讨论的话题与其他语言有关。在编程(语言概念)的文本中更好看一下,这里列出的内容太多了!

HTH