Там нет ни одного. Ссылка, которую вы предоставили, является единственной «официальной» документацией, которая по сути является прозаическим описанием, а не строгой языковой спецификацией. Сотрудники Apple считают, что этого достаточно для большинства целей, и если вам требуется что-то более формальное, вы должны отправить отчет об ошибке (!). К сожалению, шутка о том, что стандарт Objective-C определяется тем, что компилятор умеет компилировать.
Многие считают Objective-C «строгим надмножеством» или «надмножеством» языка C. ИМХО, для «классического» Objective-C (или Objective-C 1.0) я бы посчитал это истинным , В частности, я не знаю ни о каком добавлении языка Objective C, которое не сопоставляется с эквивалентным «простым C» оператором. По сути, это означает, что добавки Objective-C являются чистым синтаксическим сахаром, и можно использовать действующий стандарт C, чтобы рассуждать о мелочности. Я не уверен, что это полностью верно для Objective-C 2.0 с включенным GC. Это связано с тем, что указатели на управляемую память GC должны обрабатываться особым образом (компилятор должен вставлять различные барьеры в зависимости от особенностей указателя). Поскольку квалификаторы типа указателя GC, такие как __strong
, реализованы как __attribute__(())
внутри gcc
, это означает, что void *p;
и void __strong *p;
равны similarly qualified pointers
в соответствии со стандартом C99. Проблемы, которые это может вызвать, и даже способность писать программы, работающие детерминистическим образом, либо самоочевидны, либо нет (обратитесь за дополнительной информацией к юристу или специалисту по составлению компилятора).
Другая проблема, которая время от времени возникает, состоит в том, что язык C продолжает развиваться относительно языка Objective-C. Objective-C восходит к середине 1980-х годов, что является стандартным временем до ANSI-C. Рассмотрим следующий фрагмент кода:
NSMutableArray *mutableArray = [NSMutableArray array];
NSArray *array = mutableArray;
Это юридический код Objective-C, как он определен официальным прозаическим описанием языка. Это также одна из основных концепций объектно-ориентированного программирования. Однако, когда кто-то считает эти заявления сформулированными с точки зрения «строгого надмножества C99», он сталкивается с огромной проблемой. В частности, это нарушает C99 strict aliasing rules
. Спецификация языка уровня стандартов поможет прояснить порядок и поведение таких конфликтов. К сожалению, поскольку такого документа не существует, может быть много споров по таким деталям, что в конечном итоге приведет к ошибкам в компиляторе. Это привело к ошибке в gcc
, которая восходит к версии 3.0 ( gcc bug # 39753 ).