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?
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
with
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 🙂