Использование переменной в этом же утверждении определено? - PullRequest
1 голос
/ 20 марта 2011

Коротко и приятно: почему следующий блок кода 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 используется до его правильной инициализации?

1 Ответ

2 голосов
/ 20 марта 2011

Поскольку компилятор target-c не связан с компилятором Java, поэтому у него нет причин обрабатывать тот же случай ошибки так же, как компилятор Java.

Я согласен, было бы лучше, если бы компилятор хотя бы выдавал предупреждение в подобных случаях, но на языке, который допускает прямое манипулирование указателями, действительно трудно надежно обнаружить этот случай. Например:

MyObject* t;
MyObject** pointerToT = &t;
*pointerToT = [[MyObject alloc] init];

//now I can use 't', even though I never assigned anything to it directly
[t doSomething];
...