Коротко и приятно: почему следующий блок кода Objective C не выдает ошибку / предупреждение компилятора?
- (void)someMethod:(MyObject *)someArg {
MyObject *t = [self otherMethod:t.property]; // Typo. 't.property' should be 'someArg.property'
[t doSomething];
}
Я понимаю поведение во время выполнения, так как 't' фактически указывает на неверный адрес памяти при выделении.
Например. вышеуказанная строка кода логически эквивалентна:
MyObject *t;
t = [self otherMethod:t.property];
[t doSomething];
В Java это (если я правильно помню) обычно вызывает ошибку компилятора, так как переменная t гарантированно не будет иметь допустимого значения при вызове геттера property
. (Конечно, имеет значение, но его не стоит иметь.)
Я столкнулся с этой проблемой несколько минут назад, и мне потребовалось больше времени, чем мне бы хотелось, чтобы определить, в чем проблема. Почему компилятор не предупреждает (в любом фрагменте кода), что указатель t
используется до его правильной инициализации?