2011-01-13 78 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 

我发现了一些关于在链接器标志中加入-all_load的内容,但是这样做的结果相同。这是在iPhone上,如果它不明确。

+0

您是否导入了头文件?它在你的实现文件中说了什么? – BoltClock 2011-01-13 21:31:49

+0

添加了实现。 – Inferis 2011-01-13 22:19:03

回答

0

嗯。将构建配置更改为发布并返回调试后,它的工作方式就像一个魅力。 奇怪。

7

是的,你可以做到这一点。您可能不会将.m编译到您的项目中。

+0

“不在我的项目中编译.m”?它正好在.h文件旁边。 – Inferis 2011-01-13 22:21:26

+0

@Inferis - 当然,但是你得到的错误意味着当你的代码运行时,.m文件中定义的代码不存在,这意味着它没有加载或者你拼错了某些东西,或者它没有编译开始。 – 2011-01-13 22:30:55

0

你绝对可以做到。我猜测@implementation UIColor(Hex)

1

有什么问题你可以,但是你应该非常小心地向框架类添加方法(实例或类)。如果任何地方存在具有相同名称但语义不同的方法,则效果不明确。特别是,可能有一个私有系统框架方法具有相同的名称,或者可能会在将来的OS版本中添加一个,或者(最糟糕的是)它可以被其他一些捆绑包添加,包括输入管理器,拾色器和其他代码注入机制。这是现实生活中发生的一个实际问题。

基本上有两个选项可以解决这个问题:1)不要这样做(例如,使用标准的C函数),或2)采取措施降低使用前缀进行名称冲突的可能性,如在班级名称 - 例如,inferis_colorWithHex:

0

您是否在您调用此方法的类中导入了.h文件?另外,检查是否所有.m文件都在目标中。

2

您需要在“其他链接器标志”设置中添加-ObjC-all_load链接器标志。

0

我知道它晚了,但JiC它帮助其他人把头发撕掉几个小时,如果你在工作区中使用CocoaPods并指定了use_frameworks指令,这似乎影响了其他框架中的Category源代码是否获取加载。

相关问题