# импорт утверждений в .m или .h в target-c? - PullRequest
3 голосов
/ 01 декабря 2010

В итоге у меня были эти файлы в моих файлах .h и .m, это моя первая программа Objective-C, поэтому я хотел бы получить некоторые разъяснения, чтобы я мог все исправить.

Ответы [ 5 ]

11 голосов
/ 01 декабря 2010

Если это не влияет на определение интерфейса, вы должны поместить его в файл .m.

Если вы просто используете класс, используйте предварительное объявление:

@class AClass;

@interface Bob : NSObject {
  AClass* a;
}

Если вы внедрили что-то, импортируйте это:

#import "SomeProtocol.h"

@interface Bob : NSObject<SomeProtocol> {
}

Такие вещи действительно "лучшие практики", а не абсолютно необходимы. Директива Objective C #import означает, что вы не можете получить ошибки, потому что вы включаете файл несколько раз, так что это не техническая проблема 1015 *, но это увеличит время компиляции.

4 голосов
/ 01 декабря 2010

Вот правила, которым я следую:

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

В качестве примеров рассмотрим файлы MyClass.m, MyClass.h и MyInclude.h:

Пример, сценарий № 1:

// MyClass.h
@class MyInclude;

@interface MyClass : NSObject {
    MyInclude *myIncludeObj;
}

// MyClass.m
#import "MyClass.h"
#import "MyInclude.h"

Пример, сценарий № 2:

// MyClass.h
#import "MyInclude.h"
@interface MyClass : NSObject {
    MyInclude myIncludeObj; // MyInclude could be a plain C structure
}

// MyClass.m
#import "MyClass.h"
1 голос
/ 01 декабря 2010

У меня есть только одно правило: импорт в верхней части файла .h для суперкласса и протоколов любых классов, которые вы объявляете в файле .h.Это потому, что любой файл, который импортирует ваш .h файл, также нуждается в объявлениях для суперкласса и протоколов.Именно поэтому шаблон Xcode по умолчанию имеет #import <UIKit/UIKit.h> в файле .h, а не в файле .m.

Для всего остального (например, типов, используемых для ivars и параметров метода), используйте forward-декларации и ставьте#import в файле .m

Еще один способ выразить это: никогда не использовать предварительные объявления для суперклассов и протоколов.

1 голос
/ 01 декабря 2010

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

Что касается передового опыта, ИМХО, лучше всего ограничить область видимости.Поэтому я бы предложил поместить ваши #imports в ваши файлы реализации (.m).Если вам требуется определение класса в файле интерфейса (.h), вы можете использовать конструкцию

@ class MyClass;

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

Надеюсь, это поможет.

0 голосов
/ 01 декабря 2010

Рекомендуется помещать операторы #import в файлы .m. Если вам нужен доступ к классу внутри файла заголовка, для объявления свойства или параметра функции, используйте предварительное объявление, например:

@class Cocos2DController;

@interface HoppersAppDelegate : NSObject <UIApplicationDelegate> {
Cocos2DController*  controller;
}

Предварительное объявление позволяет системе узнать, что класс существует, хотя он еще не полностью определен. Используя этот шаблон, вы сохраните свои заголовки и гарантируете, что импортируете только те заголовки, которые вам нужны для определенного класса, а не объединяете #imports во всем приложении.

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

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