【问题标题】:Can I use Categories to add class methods?我可以使用类别来添加类方法吗?
【发布时间】:2011-01-13 21:29:42
【问题描述】:

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

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“+[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 上,如果不清楚的话。

【问题讨论】:

  • 你导入头文件了吗?它在你的实现文件中说了什么?

标签: iphone objective-c cocoa categories


【解决方案1】:

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

【讨论】:

  • "不在我的项目中编译 .m"?它就在 .h 文件旁边。
  • @Inferis - 当然,但是你得到的错误意味着当你的代码运行时,.m 文件中定义的代码不存在,这意味着它没有加载或者你拼错了一些东西,或者一开始就没有编译过。
  • 好的,请问如何强制编译?
  • 只要确保将其列为活动目标中的源文件即可。
  • 包含 .m 文件。那不是问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 看,我知道危险。我只是想知道为什么它不起作用。 ;)
    • Joe,您对类别的命名不会以任何方式影响名称冲突问题。 Objective-C 中没有命名空间。
    【解决方案4】:

    你绝对可以做到。我猜@implementation UIColor(Hex)里面有问题

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 我遇到了完全相同的问题。一切都是正确的,但它不起作用。我删除了包含在目标中的复选标记并构建。然后我添加了复选标记并再次构建它并且它工作。这个bug现在3岁了。谢谢。
        【解决方案7】:

        我知道已经很晚了,但是如果您在工作区中使用 CocoaPods 并指定了 use_frameworks 指令,那么 JiC 可以帮助其他人花费数小时的时间,这似乎会影响其他框架中的类别源代码是否被加载.

        【讨论】:

          猜你喜欢
          • 2012-04-14
          • 1970-01-01
          • 1970-01-01
          • 2021-06-17
          • 2016-06-06
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多