Почему простая программа импортирует <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++