Вопрос

Я расширяю класс из внешней библиотеки.Вот мой код:

Заголовочный файл:Менеджер+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 довольно анальный.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top