Objective-C использование #import и наследования - PullRequest
5 голосов
/ 22 февраля 2009

У меня есть гипотетический класс UIViewController с именем "foo". foo наследуется от класса bar и класса bar # import "Class A", класса, который foo широко использует. Проблема в том, что когда я использую экземпляр класса A в foo, я не получаю никаких ошибок компилятора, но я получаю предупреждение, например, что экземпляр класса A не отвечает на определенный метод. Нужно ли явно #import ClassA.h в класс 'foo'? хотя класс foo extends extends bar, который уже импортирует его?

Надеюсь, это не слишком смущает. Дайте мне знать, если мне нужно что-нибудь прояснить.

1 Ответ

12 голосов
/ 22 февраля 2009

Похоже, у вас есть проблема круговой зависимости. Да, для ее разрешения каждый файл имплементации (.m) должен #import иметь соответствующий заголовочный файл. Однако, если вы попытаетесь получить заголовок files #import друг с другом, у вас возникнут проблемы.

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

// bar.h
@class A;  // forward declaration of class A -- do not to #import it here

@interface bar : UIViewController
{
    A *member;  // ok
}

- (A) method:(A)parameter;  // also ok
@end

// bar.m
#import "bar.h"
#import "A.h"

// can now use bar & A without any errors or warnings
...