我可以使用Categories来添加类方法吗?

时间:2011-01-13 21:29:43

标签: iphone objective-c cocoa categories

我想为UIColor添加一些类方法。我已经实现了它们,一切都编译得很好,但在运行时我得到以下错误:

  

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [UIColor colorWithHex:]:无法识别的选择器发送到类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上,如果不清楚的话。

7 个答案:

答案 0 :(得分:8)

是的,你可以这样做。你可能没有将.m编译到你的项目中。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

基本上有两种方法可以解决这个问题:1)不要这样做(例如,改为使用标准C函数),或2)采取措施减少使用前缀发生名称冲突的可能性,例如类名 - 比如inferis_colorWithHex:

答案 3 :(得分:0)

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

中有问题

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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