Метод категории Objective-C доступен для подклассов?

У меня есть следующая категория:

@interface UIViewController (Additions)

- (void)exampleMethod;

@end

-----

#import "UIViewController+Additions.h"

@implementation UIViewController (Additions)

- (void)exampleMethod {
    NSLog(@"Example.");
}

@end

У меня также есть следующий абстрактный класс:

@interface DFAbstractViewController : UIViewController

@end

-----

#import "DFAbstractViewController.h"
#import "UIViewController+Additions.h"

@implementation DFAbstractViewController

@end

И вот конкретный класс:

#import "DFAbstractViewController.h"

@interface DFConcreteViewController : DFAbstractViewController

@end

-----

#import "DFConcreteViewController.h"

@implementation DFConcreteViewController

- (void)viewDidLoad {
    [self exampleMethod];
}

@end

Хорошо. Насколько я понимаю, конкретный класс DFConcreteViewController может использовать методы, импортированные из категории своего суперкласса DFAbstractViewController. Это правильно, потому что вызов метода работает так, как ожидалось.

Проблема в том, что Xcode выдает мне следующее предупреждение: 'DFConcreteViewController' may not respond to '-exampleMethod'.

Я не понимаю, как этот метод и его доступность для DFConcreteViewController не совсем понятны компилятору? Может быть, я что-то неправильно понял о категориях?


person David Foster    schedule 03.08.2010    source источник


Ответы (1)


Верно. Я понял. Это была элементарная ошибка, из-за которой я чувствую себя довольно глупо. Если вы хотите, чтобы методы вашей категории были видны подклассам, обязательно импортируйте категорию в заголовок:

#import "UIViewController+Additions.h"

@interface DFAbstractViewController : UIViewController

@end
person David Foster    schedule 03.08.2010
comment
У меня была такая же проблема, и я наткнулся на ваш пост, чтобы решить эту проблему. Однако я включаю правильный заголовок (класс + категория) и все еще получаю предупреждение компилятора. - person ; 26.01.2011
comment
Мэтт, вы импортируете категорию в заголовочный файл (.h), а не реализацию? Компилятор может видеть только методы категории суперкласса, когда категории импортированы в файл .h. - person David Foster; 26.01.2011