Золотое правило отладки: это не ошибка компилятора .Некоторые виды поведения немного странные, например, тот, который вы демонстрируете здесь, но они сделаны специально.Что касается рассматриваемой «ошибки», то компилятор может синтезировать переменные экземпляра для вас без их объявления:
@interface Foo {}
@property(assign) float bar;
@end
@implementation Foo
@synthesize bar;
- (void) somewhere { bar = 1; }
@end
Это удобно и позволяет вам перемещать частные интерфейсы в файл реализации.Возвращаясь к вашему примеру, теперь у вас есть две переменные экземпляра, var
и m_var
, вторая действует как хранилище для свойства var
.Это не совсем то, чем можно радоваться, но в этом есть смысл.(Может ли быть предупреждение, что у вас есть переменная экземпляра, которая не действует как хранилище для свойства с тем же именем?)
Так как этот тип поведения в основном задуман, вы не найдетеэто в радаре и придется искать список распространенных ошибок Objective-C.( Это - еще одна интересная ситуация.)