Почему Foundation.h не импортируется в стандартные шаблоны Xcode? - PullRequest
4 голосов
/ 21 мая 2011

Я только что заметил, что когда я создаю приложение для iPhone с использованием стандартных шаблонов в XCode (приложение на основе просмотра, приложение на основе окна и т. Д.), Файлы заголовков импортируют только UIKit.h (а не Foundation.h). Итак, если файл Foundation.h не импортирован, как можно использовать в программе классы Foundation, такие как NSString, NSArray и т. Д.? Разве это не должно быть ошибкой?

Ответы [ 3 ]

8 голосов
/ 21 мая 2011

Он импортируется в предварительно скомпилированный заголовочный файл (расширение .pch) в вашем проекте.

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
#endif

Почему UIKit.h имеет две строки импорта на файл, так как он также показан вышеВпрочем, я не слишком уверен.В любом случае это не должно иметь значения, поскольку вторая строка #import не приведет к повторному включению UIKit, если он уже включен в предварительно скомпилированный заголовочный файл.

2 голосов
/ 21 мая 2011

Похоже, что файлы шаблонов предназначены для работы с или без предварительно скомпилированных заголовков, поэтому они импортируют файлы заголовков, которые они используют.Если вы создаете подкласс NSObject, файл шаблона будет импортировать Foundation.Если вы создаете подкласс объекта UIKit, заголовок UIKit будет импортирован.

ОК, так почему вы можете использовать классы Foundation, такие как NSString, когда импортируется только UIKit.Ну, почти все UIKit заголовки импорта Foundation.h!

Надеюсь, это имеет смысл.

2 голосов
/ 21 мая 2011

Если вы посмотрите на отдельные заголовки UIKit, они сами импортируют Foundation.Как заметил BoltClock, он также находится в стандартном .pch

Причина, по которой он может быть помещен во все эти места, упоминается в "Язык программирования Objective-C" :

Эта директива идентична #include, за исключением того, что она гарантирует, что один и тот же файл никогда не включается более одного раза.Поэтому он предпочтителен и используется вместо #include в примерах кода в документации на основе Objective-C.

Вы хотите убедиться, что они есть в каждом файле, которому требуется доступ к символам, определенным в Foundation.,Причина, по которой он повторяется, заключается в том, что он помогает с чтением и пониманием кода;он говорит: «Этот код опирается на материал, который находится в этом заголовке».

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