【问题标题】:Using variables in different functions? Objective-C [closed]在不同的函数中使用变量? Objective-C [关闭]
【发布时间】:2013-03-22 03:33:30
【问题描述】:

我正在尝试在第二个函数 -(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;
    }


}

【问题讨论】:

  • 忠告:查看braces vs. class definition vs. globals 如何影响变量的范围。
  • 这是基本的编程知识,找Objective-C的教程。您正在寻找的是实例变量。
  • 所以我的嵌套函数 randX 和 randY 只会使用块作用域中的同名变量,对吗?
  • 甚至不需要找到 Objective-C 的教程。 C 或 Java 教程将涵盖这一点。在处理 Objective-C 之前你需要了解的非常基本的东西。
  • 所以我将 randY 和 randX 声明为静态变量,然后改为使用它。它可以跟踪第一个放置的坐标,但永远坚持这些坐标。无论如何要返回新坐标的值(tnewX,tnewY)..

标签: objective-c


【解决方案1】:

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

局部变量 randXrandY 的生命周期是从使用方法 awakeaccelerometer 声明它们的点开始,直到创建它们的特定调用 awakeaccelerometer 返回。这两个变量的作用域是从它们的声明点到方法结束的代码。当在 awakeaccelerometer 内调用 CGMakePoint 时,randXrandY 两个变量仍然存在,但超出范围 - CGMakePoint 内的任何代码都无法引用它们。

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

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

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

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2017-04-24
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多