При перемещении кода с Xcode 3 на 4 возникает ошибка: невозможно объявить переменную внутри @interface или @protocol

Я переношу свои старые приложения для iPhone с Xcode 3 на Xcode 4. Я получаю эту ошибку в коде, который использовался для сборки в Xcode 3 - на самом деле я написал ее таким образом, чтобы скрыть детали реализации от других модулей. Однако в Objective-C, похоже, что-то изменилось. Этот код теперь получает ошибку

Невозможно объявить переменную внутри @interface или @protocol.

Помните, что это код в верхней части файла .m, а не .h

@interface VisualViewController ()
BOOL doReloadPhoto;

+ (void)buildVisualEffectInfo;

@property (nonatomic, retain) HandleCheckListSetting *checkListHandler;
@end

person halt00    schedule 28.04.2012    source источник


Ответы (1)


Возможно, он компилировался раньше, но я не думаю, что он делал то, что вы думаете. Похоже, вы хотите создать частный ivar в расширении класса. Синтаксис, который у вас есть, - это просто переменная верхнего уровня, эквивалентная:

BOOL doReloadPhoto;

@interface VisualViewController ()
// etc.
@end

Вам нужно заключить его в фигурные скобки, чтобы он был иваром:

@interface VisualViewController () 
{
    BOOL doReloadPhoto;
}

(И наоборот, я не уверен, что это - ivar в расширении - было возможно с компилятором Xcode 3, вероятно, поэтому вы сделали это так, как вы.) Похоже, компилятор теперь (разумно) указывает, что код, который у вас есть, вероятно, не делает того, что вы ожидаете, и заставляет вас полностью прояснить свое намерение.

Также недавно стало возможно объявлять частные ivars в блоке @implementation, используя тот же синтаксис:

@implementation VisualViewController
{
    BOOL doReloadPhoto;
}
person jscs    schedule 28.04.2012
comment
Ого, я понятия не имел, что вы можете сделать это в реализации сейчас. Круто. - person Jack Lawrence; 28.04.2012
comment
@Jack: На самом деле это рекомендованная практика Apple. Я люблю это. В этом в миллион раз больше смысла; ivars действительно являются частью реализации, а не интерфейсом. - person jscs; 28.04.2012
comment
@JacquesCousteau +1. Я этого тоже не знал. Ты узнаешь что-то новое каждый день. ;) - person Itai Ferber; 28.04.2012