Objective-C类别导致无法识别的选择器

时间:2010-10-22 15:41:05

标签: iphone objective-c cocoa categories

我的项目有一个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

8 个答案:

答案 0 :(得分:208)

有几种可能性:

  1. 您没有将UIImage+TTShare.m链接到目标中。所以,虽然你有标题,但你没有编译实现。
  2. 如果这是静态库的一部分,则需要将-all_load添加到针对库链接的应用的其他链接器标记构建设置。

答案 1 :(得分:8)

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

答案 2 :(得分:6)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

另一种可能性。

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

答案 5 :(得分:0)

又一种可能性:

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

我正在将代码从一个项目复制到另一个项目,而且我错误地将相同的源代码粘贴到.h文件和.m文件中(我已将这些代码用于.h文件)。我修复了我的.m文件,但它确实有效。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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