Когда включать #import в файл реализации - PullRequest
2 голосов
/ 22 марта 2011

Изучение Objective-C и других языков на основе c Я узнал, что вы должны поместить #include и #imports в заголовочный файл. И класс @ идет туда же. Недавно, глядя на пример кода из Apple и других источников в Интернете, @class находится в заголовке, а все импорты - в файле реализации.

Что правильно? Есть ли причины для обоих? Кроме того, зачем вам нужно указывать объявление @class, если вы импортируете файл заголовка.

Ответы [ 2 ]

7 голосов
/ 22 марта 2011

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

ClassA.h:

@interface ClassA : NSObject
{
  ClassB *b;
}

ClassB.h:

@interface ClassB : NSObject
{
  ClassA *a;
}

Этот код не будет компилироваться - у вас круговая зависимость в этих заголовках. Решение состоит в том, чтобы объявить требуемые классы с помощью директивы @class.

Ситуация, в которой вы можете предпочесть директиву #import в заголовочном файле, может возникнуть, если у вас есть какой-то общий код, помимо простого имени класса, которое вас интересует в другом заголовке - например, функции стиля C или перечислимые типы или что-то еще.

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

Изучение Objective-C и других языков на основе c Я узнал, что вы должны поместить #include и #imports в заголовочный файл.

нет - не на языках c. вы должны поместить их в файлы реализации, где это возможно. вы не всегда можете создать заголовок с нулевой зависимостью, но вы должны минимизировать его.

Языки на основе c требуют много времени для компиляции, особенно когда зависимости и включения очень сложны, или есть ненужные включения (введение большей зависимости, по совпадению).

И @класс тоже идет туда. Недавно, глядя на пример кода из Apple и других источников в Интернете, @class находится в заголовке, а все импортированные файлы находятся в файле реализации. Что правильно?

используйте предварительные объявления (@class NAME;, @protocol NAME;, struct NAME, класс NAME; `и т. Д.) Везде, где вы можете.

Есть ли причины для обоих?

Включение в заголовок - это ленивый способ, он замедляет время сборки и вносит большую зависимость. это удобно, потому что вам не нужно писать столько объявлений include / import, но это не важно для людей, которые должны использовать ваши программы.

Кроме того, зачем вам нужно указывать объявление @class, если вы импортируете файл заголовка.

если интерфейс класса уже виден (уже включен, или другой файл объявил его), вам не нужны оба. вам понадобится интерфейс, видимый, если вы собираетесь использовать тип (кроме некоторых очень тривиальных случаев).

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

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

удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...