2011-01-13 2 views
2

Я хочу добавить некоторые методы класса в UIColor. Я реализовал их, и все отлично компилируется, но во время выполнения я получаю следующее сообщение об ошибке:Могу ли я использовать Категории для добавления методов класса?

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIColor colorWithHex:]: unrecognized selector sent to class 0x8d1d68'

Вот заголовок файла:

@interface UIColor (Hex) 
+ (UIColor*) colorWithHex: (NSUInteger) hex; 
@end 

Вот реализация:

#import "UIColor+Hex.h" 


@implementation UIColor (Hex) 

+ (UIColor*) colorWithHex: (NSUInteger) hex { 
    CGFloat red, green, blue, alpha; 

    red = ((CGFloat)((hex >> 16) & 0xFF))/((CGFloat)0xFF); 
    green = ((CGFloat)((hex >> 8) & 0xFF))/((CGFloat)0xFF); 
    blue = ((CGFloat)((hex >> 0) & 0xFF))/((CGFloat)0xFF); 
    alpha = hex > 0xFFFFFF ? ((CGFloat)((hex >> 24) & 0xFF))/((CGFloat)0xFF) : 1; 

    return [UIColor colorWithRed: red green:green blue:blue alpha:alpha]; 
} 
@end 

I «Мы нашли что-то о добавлении -all_load к флагам компоновщика, но при этом получается тот же результат. Это на iPhone, если не ясно.

+0

Вы импортировали файл заголовка? Что он говорит в вашем файле реализации? – BoltClock

+0

Добавлена ​​реализация. – Inferis

ответ

0

Hm. После изменения конфигурации сборки для выпуска и возврата к отладке он работал как шарм. Странно.

+0

У меня была такая же проблема. Все было правильно, но оно не работало. Я удалил галочку, включая ее в цель и построил. Затем я добавил галочку и снова построил, и это сработало. Эта ошибка составляет 3 года. Благодарю. – LostInTheTrees

7

Да, вы можете это сделать. Вероятно, вы не компилируете .m в свой проект.

+0

«Не компилировать .m в моем проекте»? Это рядом с файлом .h. – Inferis

+0

@Inferis - конечно, но ошибка, которую вы получаете, означает, что при запуске вашего кода код, определенный в файле .m, отсутствует, то есть он не был загружен или вы что-то неправильно написали, или он никогда не был скомпилированный для начала. –

+0

Хорошо, и как я могу заставить его скомпилироваться? – Inferis

0

Вы определенно можете это сделать. Я предполагаю, что что-то не так в @implementation UIColor(Hex)

1

Вы можете, но вы должны быть очень осторожны с добавлением методов (экземпляра или класса) в классы инфраструктуры. Если метод с тем же именем, но с другой семантикой существует где угодно, эффекты не определены. В частности, может существовать метод частной системы с одним и тем же именем, или один может быть добавлен будущей версией ОС, или (что хуже всего), он может быть добавлен каким-то другим пакетом, включая менеджеров ввода, подборщиков цветов и других кодовые инъекционные механизмы. Это настоящая проблема, которая возникает в реальной жизни.

Существует два основных способа устранения этого: 1) Не делайте этого (например, используйте стандартную C-функцию) или 2) предпринимайте шаги, чтобы уменьшить вероятность конфликта имен с помощью префикса, например в именах классов - скажем, inferis_colorWithHex:.

+0

посмотри, я знаю опасности. Я просто хочу знать, почему это не работает. ;) – Inferis

+0

@ Joe: круто, не знал, что техника. – Inferis

+0

+1 для комментария «это ковбой еще прохладно», хе – donkim

0

Вы импортировали файл .h в класс, который вы вызываете этот метод? Кроме того, проверьте, находятся ли все файлы .m в целевом объекте.

2

Необходимо установить флагов-линкеров -ObjC и -all_load в настройках «Другие значки компоновщика».

0

Я знаю, что поздно, но JiC помогает кому-то еще разрывать волосы в течение нескольких часов, если вы используете CocoaPods в рабочей области и указали директиву use_frameworks, это, похоже, влияет на то, будет ли исходный код категории в других Frameworks загружен.

Смежные вопросы