web-dev-qa-db-ja.com

認識されないセレクタを引き起こすObjective-Cカテゴリ

私のプロジェクトには、別のクラスから呼び出したい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
67
devinross

いくつかの可能性:

  1. UIImage+TTShare.mをターゲットにリンクしていません。そのため、ヘッダーがある間は、実装をコンパイルしていません。
  2. これが静的ライブラリの一部である場合は、-all_loadをライブラリにリンクするアプリのその他のリンカーフラグビルド設定に追加する必要があります。
211
Dave DeLong

カテゴリメソッドを使用する場合は、-ObjCをAPPのその他のリンカーフラグビルド設定に追加する必要があります。

9
ling

同じ問題があり、この修正も適用する必要がありました。 NSDate-Extensions.mソースファイルはコンパイルされていなかったため、プロジェクト設定に移動し、適切なターゲットを選択し、「ビルドフェーズ」タブをクリックして、「ソースをコンパイル」アイテムを展開し、+記号をクリックする必要がありましたNSDate-Extensions.mファイルを手動で追加します。

6
Clive Paterson

インターフェースでimageNamedの代わりにimageNamedDRを書くためかもしれません。

0
Hlung

このエラーメッセージが表示され、Cocoapodsを使用しています。エラーを修正するには、pod installを再度クリックして、必要なリンクをすべて正しく作成します。

0
H6.

さらに別の可能性:

これはほとんど恥ずかしくて認められませんが、誰かが同じ愚かな間違いをしたかもしれない場合に備えて:

あるプロジェクトから別のプロジェクトにコードをコピーしていましたが、誤って.hファイルと.mファイルに同じソースコードを貼り付けていました(両方に.hファイル)。 .mファイルを修正し、機能しました。

0

別の可能性。

カテゴリの実装はありますが、インターフェースはありません。 * .hでカテゴリのインターフェイスを宣言するのを忘れたことを意味します。

0
Voda Ion