2

I'm receiving the error 'currentUpdateMethod' undeclared (first use in this function). The variable this refers to, currentUpdateMethod, is an instance variable of type SEL declared in the header file. Because building to the simulator and running the app works as expected, I believe I have everything set up correctly. This error only appeared today - I have been testing on the device for several days now without issue. I did attempt to clean and clean all targets. I even type out the variable name into the file in xcode and it autocompletes the variable for me. What could cause the device compile to fail on these variables but not the compile for simulator?

Edit: Code follows.

Superclass:

#import "Deployable.h"

@interface Drawable : Deployable {

float currentDelta;

SEL currentUpdateMethod;
SEL currentAnimationMethod;
SEL currentBatchMethod;

float rotation;
}

- (id) init;

- (id) initWithActivationTime:(float)time;

- (int) updateWithDelta:(float)delta;

- (int) animate;

- (int) batch;

@end

Then the problem class:

#import "Drawable.h"
#import "Structures.h" //contains Vector2f declaration

@interface Player : Drawable {

    Image *playerGraphic;

    Vector2f position;

}

@property (nonatomic) Vector2f position;

- (id) initWithImage:(Image *)aGraphic andPosition:(Vector2f)aPosition;

- (void) setupInactiveState;
- (int) updateInactiveState;
- (int) animateInactiveState;
- (int) batchInactiveState;

- (void) setupActiveState;
- (int) updateActiveState;
- (int) animateActiveState;
- (int) batchActiveState;

@end

And its implementation, where the errors are thrown:

#import "Player.h"
#import "AIEngine.h"

@implementation Player

@synthesize position;

- (id) initWithImage:(Image *)aGraphic andPosition:(Vector2f)aPosition {

    self = [super init];

    if(self) {

        playerGraphic = [aGraphic retain];
        position = aPosition;


    }

    return self;
}

- (int) deployWithScene:(MainScene *)newScene {

    [super deployWithScene:newScene];

    [self setupInactiveState];

    return 1;
}

- (void) setupInactiveState {

    currentUpdateMethod = @selector(updateInactiveState); //'currentUpdateMethod' undeclared (first use in this function)
    currentAnimationMethod = @selector(animateInactiveState); //'currentAnimateMethod' undeclared (first use in this function)
    currentBatchMethod = @selector(batchInactiveState); //'currentAnimateMethod' undeclared (first use in this function)

}

- (void) setupActiveState {    

    currentUpdateMethod = @selector(updateActiveState); //'currentUpdateMethod' undeclared (first use in this function)
    currentAnimationMethod = @selector(animateActiveState); //'currentAnimateMethod' undeclared (first use in this function)
    currentBatchMethod = @selector(batchActiveState); //'currentBatchMethod' undeclared (first use in this function)

}

@end

Just to reiterate, those six errors are only thrown when building for device. When I build for simulator, the app builds and runs normally.

Edit2: I switched to LLVM only and the errors were not thrown. I'd like to figure out the source of the problem instead of just using the other compiler. Any ideas?

brodney
  • 1,176
  • 2
  • 14
  • 29
  • 2
    Could you show us the code? You might have some `#ifdef` macros somewhere that might be screwing things up. – BoltClock May 25 '11 at 05:17
  • @BoltClock You really think that he would know how to put such macros - but didn't realize that that's what causing the problem? But i do agree that without code there isn't much we can do... – Avi Shukron May 25 '11 at 05:29
  • Are you using GCC or LLVM? GCC has some... interesting bugs related to 'protected' vars (see http://stackoverflow.com/questions/2778405/not-so-silly-objective-c-inheritance-problem-when-using-property-gcc-bug) – jv42 May 25 '11 at 13:09
  • I'll try switching the compiler if it isn't LLVM. It's odd that it compiled at one time with no errors and only recently started. – brodney May 25 '11 at 15:49

2 Answers2

2

I am pretty certain that this is a bug in Xcode, as there is nothing wrong with your code that I can see.

I would try these two things:

1) For a quick fix, you could try synthesizing your variables and then replacing

currentUpdateMethod = @selector(updateInactiveState);

with

[self setCurrentUpdateMethod:@selector(updateInactiveState)];

2) Remove the files from your project. Create the class again from scratch. Copy the old code into the new file.

Looks like this guy had a similar problem: Strange error regarding instance variables & superclass

Let me know if these suggestions help. If they do, I would kindly ask you to submit the bug to the Xcode devs :)

Community
  • 1
  • 1
3rdFunkyBot
  • 396
  • 3
  • 8
2

I am having the same issue for weeks

"Variable Undeclared" error when compiling to iOS Device, but not for Simulator

One solution I found is to simply change the compiler from the default LLVM GCC 4.2 to LLVM Compiler 2.0 (or to `Apple LLVM Compiler 2.1). It seems to be a bug in the compiler, but it is just a guess.

Changing it is a quick fix for your problem if there is no need for you to use the GCC compiler at all.

Community
  • 1
  • 1
Felipe Sabino
  • 17,825
  • 6
  • 78
  • 112