【问题标题】:Objective-C Category Causing unrecognized selectorObjective-C 类别导致无法识别的选择器
【发布时间】:2011-04-29 05:57:51
【问题描述】:

我的项目有一个UIImage 类别函数,我想从另一个类调用它。我正确导入了图像类别的头文件,并且我可以编译项目而没有任何警告。

问题是,当我调用UIImage 类别函数时,我看到了一个无法识别的选择器错误,并带有NSInvalidArgumentException。如果我已正确链接所有内容,为什么会看到此内容?

#import <UIKit/UIKit.h>

@interface UIImage (DRShare)

+ (UIImage*) imageNamed:(NSString*)name;

@end


@implementation UIImage (DRShare)

+ (UIImage*) imageNamedDR:(NSString*)name{

    CGFloat s = 1.0f;
    if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]){
        s = [[UIScreen mainScreen] scale];
    }

    NSString *path = [NSString stringWithFormat:@"%@%@%@.png",kImagesPath,name,s > 1 ? @"@2x":@""];
    return [UIImage imageWithContentsOfFile:DRBUNDLE(path)];
}

@end

调用它的文件:

        backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamedDR:@"Share Popup Background"]];

引发异常:

2010-10-22 11:51:02.880 Stuff[11432:207] +[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938
2010-10-22 11:51:02.883 Stuff[11432:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIImage imageNamedDR:]: unrecognized selector sent to class 0x1f8e938'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02e65b99 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x02fb540e objc_exception_throw + 47
    2   CoreFoundation                      0x02e6776b +[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02dd72b6 ___forwarding___ + 966
    4   CoreFoundation                      0x02dd6e72 _CF_forwarding_prep_0 + 50
    5   TapTapShare                         0x0001291c -[DRShareViewController backgroundView] + 127
    6   TapTapShare                         0x00012343 -[DRShareViewController loadView] + 639
    7   UIKit                               0x0044f54f -[UIViewController view] + 56
    8   UIKit                               0x0044d9f4 -[UIViewController contentScrollView] + 42
    9   UIKit                               0x0045d7e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
    10  UIKit                               0x0045bea3 -[UINavigationController _layoutViewController:] + 43
    11  UIKit                               0x0045d12d -[UINavigationController _startTransition:fromViewController:toViewController:] + 524
    12  UIKit                               0x00457ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
    13  UIKit                               0x00574b55 -[UILayoutContainerView layoutSubviews] + 226
    14  QuartzCore                          0x02616481 -[CALayer layoutSublayers] + 177
    15  QuartzCore                          0x026161b1 CALayerLayoutIfNeeded + 220
    16  QuartzCore                          0x026160bd -[CALayer layoutIfNeeded] + 111

【问题讨论】:

  • 请提供代码和异常详情。没有这个就不可能回答。
  • imageNamedTT: 的声明也很有用。
  • 会不会,你的实例实际上是一个不同的类?
  • ps。这是一个奇怪的问题,我已经让它工作很长时间了,但有些东西出了问题。
  • 可能只是我很愚蠢,但您已声明 imageNamed: and then the implementation for imageNamedDR:` 但此方法未在标头中声明。 (显然很旧,你现在可能已经解决了这个问题)。这只是一个错字还是一个实际问题?

标签: iphone objective-c cocoa categories


【解决方案1】:

几种可能性:

  1. 您没有将UIImage+TTShare.m 链接到您的目标。因此,当您拥有标头时,您并没有编译实现。
  2. 如果这是静态库的一部分,您需要将 -all_load 添加到 Other Linker Flags 构建设置,以便应用链接到该库。

【讨论】:

  • 为了记录,我想我搞砸了我的静态库目标。
  • 感谢您指出静态库的问题。 developer.apple.com/library/mac/#qa/qa1490/_index.html 有更多信息。为了清楚起见,您必须将该标志添加到包含静态库的应用程序的链接器标志中,而不是在构建静态库本身时。
  • stackoverflow.com/a/8437129/1972476 中所述,Xcode 也可能是这里的罪魁祸首。我无意中使用类模板创建了文件,删除了这些文件并使用类别模板重新创建了具有相同名称的文件。重命名实现(并返回)后它起作用了。
  • 您是指客户端应用的构建设置中的-all_load不是构建静态库时的意思吗?这对我有用。
  • 在使用-all_load之前,一定要尝试是否只添加-ObjC可以解决问题。所有加载都会不必要地增加可执行文件的大小。
【解决方案2】:

如果你想使用 Category 方法,你必须将 -ObjC 添加到你的 APP 的 Other Linker Flags 构建设置中。

【讨论】:

  • 哇。当然。在我的情况下,我的主应用程序的子项目中有一个类别,该类别仅在子项目中使用,但将 -ObjC 添加到主应用程序修复了它。谢谢。
【解决方案3】:

我遇到了同样的问题,也必须应用此修复程序。 我的 NSDate-Extensions.m 源文件没有编译,所以我必须进入项目设置,然后选择适当的目标,然后单击“构建阶段”选项卡,然后展开“编译源”项,然后单击 + 符号并手动添加我的 NSDate-Extensions.m 文件。

【讨论】:

    【解决方案4】:

    我收到此错误消息,我正在使用 Cocoapods。为了修复这个错误,我只需要再次调用pod install 来正确创建所有必要的链接。

    【讨论】:

      【解决方案5】:

      另一种可能性。

      您有类别的实现,但没有接口。 我的意思是你忘了在 *.h 中声明你的类别的接口。

      【讨论】:

        【解决方案6】:

        还有一种可能:

        承认这几乎太尴尬了,但以防万一有人犯了同样的愚蠢错误:

        我正在将代码从一个项目复制到另一个项目,并且错误地将相同的源代码粘贴到 .h 文件和 .m 文件中(我在这两个文件中都放置了用于 .h 文件的代码)。我修复了我的 .m 文件,它工作正常。

        【讨论】:

          【解决方案7】:

          可能是因为你在界面中写了imageNamed而不是imageNamedDR..

          【讨论】:

            【解决方案8】:

            基于oc创建的sdk混合项目在sdk相关的混合demo项目中被swift文件调用时会崩溃,提示找不到sdk中的oc分类方法。我尝试将编译后的包放在带有库的链接二进制文件中(使用库构建阶段链接二进制文件),它可以工作!仅仅设置demo的依赖来关联SDK是不够的。算是混sdk混demo项目的坑!

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-11
              相关资源
              最近更新 更多