Почему простая программа импортирует <Foundation/Foundation.h> вместо отдельных файлов заголовков?
Я новичок в Objective-C. Сгенерированный код шаблона Xcode содержит:
#import <Foundation/Foundation.h>
Когда я проверяю это в /System/Library/Frameworks/Foundation.framework/Headers, там есть почти 2 тысячи заголовочных файлов!
Мой вопрос: для действительно простого кода, который использует только NSString, почему бы не импортировать только файл NSString.h?
Влияет ли импорт всей связки Foundation Framework на производительность исполняемых файлов? Если нет, есть ли у него какие-то преимущества?
Ответы
Ответ 1
Это не влияет на производительность, поскольку встроенные фреймворки все там установлены на вашем устройстве, уже готовые к подключению вашим исполняемым файлом.
Что вы говорите, когда вы #import <Foundation/Foundation.h>
: "Я бы хотел получить доступ к функциональным возможностям фреймворка, даже если я его не использую". Его семантическое разделение.
Компилятор выполнит всю оптимизацию, требующую отбрасывания неиспользуемых символов.
Проблема с выполнением импорта на NSString.h - знаете ли вы, какие зависимости существуют для NSString. Я не знаю, и мне тоже этого не нужно.
Ответ 2
В соответствии с вашим вопросом, как действительно простой код, как показано ниже:
int main() {
/* my first program in Objective-C */
NSLog(@"Hello, World! \n");
return 0;
}
Просто пытаясь напечатать "Hello World", если мы не импортируем framework.h, мы получим ошибку ниже:
main.m: In function ‘main:
main.m:4:3: warning: implicit declaration of function ‘NSLog [-Wimplicit-function-declaration]
NSLog(@"Hello, World! \n");
^~~~~
main.m:4:3: error: cannot find interface declaration for ‘NSConstantString
Это просто означает, что все основные вещи, необходимые для выполнения программы, автоматически включаются в #import. Как и в этом случае NSLog
Это так же, как #include<stdio.h>
в C или #inlcude<iostream.h>
в c++