Странное поведение импорта категории Objective-C
-
11-09-2019 - |
Вопрос
Я расширяю класс из внешней библиотеки.Вот мой код:
Заголовочный файл:Менеджер+MyCategory.h
#import "Manager.h"
#import "Element.h"
@interface Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag;
@end
Файл реализации:Менеджер+MyCategory.h файл
@implementation Manager (myCategory)
- (Element*) elementWithTag:(NSInteger)tag {
...
}
@end
Вот как я использую эту категорию:
#import "Manager+MyCategory.h"
@implementation myClass
- (void) myFunction:(NSInteger)tag {
Manager* myManager = [[Manager alloc] init];
Element* = [myManager elementWithTag:tag];
...
[myManager release];
}
@end
Когда я компилирую, у меня нет предупреждений, но когда я запускаю программу, я получаю следующую ошибку:
*** -[Manager elementWithTag:]: unrecognized selector sent to instance 0x105d9a0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[Manager elementWithTag:]:
Заголовочный файл (т. е. Manager+MyCategory.h) импортирован правильно, но похоже, что связь с файлом реализации не установлена.Если я заменю #import "Manager+MyCategory**.h**" на #import "Manager+MyCategory**.m**" в своем классе, это будет работать правильно.
Кто-нибудь может объяснить мне, что я забыл?Спасибо
Решение
Категории не очень хорошо работают с традиционным Unix. статический библиотеки.
Если это ваш случай, то, похоже, передача компоновщику параметра -ObjC решает проблему.
Технические вопросы и ответы Apple QA1490 объясняет все это.
Другие советы
Я подозреваю, что вы забыли добавить Manager+MyCategory.m к соответствующей цели в Xcode.Вы не получите ошибку компоновщика, поскольку все символы существуют и нет предупреждения компилятора, поскольку вы включили соответствующие файлы заголовков, но во время выполнения реализация elementWithTag:
метод отсутствует.
Извините, не смог добавить это как комментарий...
Просто для тестирования вы можете добавить внешнюю функцию c, объявленную в заголовке и реализованную в файле .m.Если вы вызовете эту функцию c в своем тестовом коде, то это воля генерировать ошибку компоновщика из-за неразрешенного идентификатора.
Это может облегчить исследование проблемы, поскольку обеспечивает немедленную обратную связь и может дать дополнительные подсказки о том, почему файл не включается.
Учитывая сроки, я предполагаю, что вы это сделали, но на всякий случай...убедитесь, что вы очистили цель, закрыли XCode и затем снова открыли.У меня были случаи, когда файлы проекта повреждались в памяти и вели себя странно.
Барни
У меня возникла эта проблема при обновлении до Xcode 4.
Чтобы исправить это, мне пришлось разделить определение категории на отдельные .m и .h - Xcode 3 казался нормальным, поскольку реализация и интерфейс находились в .h...но, ох нет, Xcode 4 довольно анальный.