Я был немного озадачен, когда, просматривая более неясный код реализации в одном из моих классов, я нашел несколько определений методов, которые выглядели так:
- (void)doSomething; {
// Something...
}
- (void)doSomethingWithSomething:(Something*)aSomething; {
// Something with aSomething...
}
Это явно артефакт от копирования и вставки объявлений метода в блок реализации и последующего игнорирования удаления точек с запятой из объявления при предоставлении определения.
Путаница связана с тем, что эти определения методов не только компилируются, но и выполняются идеально. Я видел их и сразу же ожидал ошибок компиляции, как, например, то, что вы могли бы ожидать, если бы попытались использовать C-сумасшествие, например:
void doSomething(); {
/* Something */
}
Итак, возникает вопрос: "Что вообще делает эта точка с запятой?" Кажется, что он абсолютно ничего не делает, и в этом случае возникает вопрос: «Почему компилятор допускает одну случайную точку с запятой в этом конкретном месте?» Нет точки с запятой, это нормально, но, видимо, тоже хорошо, но больше ли это ошибка компиляции?