Переменная «undeclared» только при компиляции для устройства - PullRequest
2 голосов
/ 25 мая 2011

Я получаю необъявленную ошибку currentUpdateMethod (первое использование в этой функции).Переменная, к которой это относится, currentUpdateMethod, является переменной экземпляра типа SEL, объявленной в заголовочном файле.Поскольку сборка на симуляторе и запуск приложения работают должным образом, я считаю, что все настроено правильно.Эта ошибка появилась только сегодня - я тестирую на устройстве уже несколько дней без проблем.Я попытался очистить и убрать все цели.Я даже ввожу имя переменной в файл в xcode, и она автоматически заполняет переменную для меня.Что может привести к сбою компиляции устройства по этим переменным, но не по компиляции для симулятора?

Редактировать: Код следует.

Суперкласс:

#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

Тогда класс проблемы:

#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

И его реализация, где генерируются ошибки:

#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

Просто повторюсь, эти шесть ошибок только выбрасываются при сборке для устройства.Когда я строю для симулятора, приложение собирается и работает нормально.

Edit2: я переключился только на LLVM, и ошибки не возникали.Я хотел бы выяснить источник проблемы, а не просто использовать другой компилятор.Есть идеи?

Ответы [ 2 ]

2 голосов
/ 04 августа 2011

У меня та же проблема в течение нескольких недель

Ошибка «Переменная необъявленная» при компиляции на устройство iOS, но не для симулятора

Одно решение, которое я нашел, это просто изменить компилятор со LLVM GCC 4.2 по умолчанию LLVM Compiler 2.0 (или на Apple LLVM Compiler 2.1). Кажется, это ошибка в компиляторе, но это только предположение.

Изменение его - быстрое решение вашей проблемы, если вам вообще не нужно использовать компилятор GCC.

2 голосов
/ 27 мая 2011

Я вполне уверен, что это ошибка в Xcode, так как в вашем коде нет ничего плохого, что я вижу.

Я бы попробовал эти две вещи:

1) Длябыстрое решение, вы можете попробовать синтезировать ваши переменные и затем заменить

currentUpdateMethod = @selector(updateInactiveState);

на

[self setCurrentUpdateMethod:@selector(updateInactiveState)];

2) Удалите файлы из вашего проекта.Создайте класс заново с нуля.Скопируйте старый код в новый файл.

Похоже, у этого парня была похожая проблема: Странная ошибка относительно переменных экземпляра и суперкласса

Дайте мне знать, если эти предложения помогут.Если они это сделают, я прошу вас сообщить об ошибке разработчикам Xcode:)

...