2011-01-13 11 views
2

UIColorにいくつかのクラスメソッドを追加したいと思います。私はそれらを実装しましたし、すべてが正常にコンパイルが、実行時に、私は次のエラーを取得する:カテゴリを使用してクラスメソッドを追加できますか?

@interface UIColor (Hex) 
+ (UIColor*) colorWithHex: (NSUInteger) hex; 
@end 

ここでの実装があります:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIColor colorWithHex:]: unrecognized selector sent to class 0x8d1d68'

ここでは、ヘッダファイルです

#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上にある。

+0

ヘッダーファイルをインポートしましたか?あなたの実装ファイルには何が書いてありますか? – BoltClock

+0

実装を追加しました。 – Inferis

答えて

0

hm。ビルド構成をリリースしてデバッグするように変更した後、それは魅力的なように機能しました。 奇妙な。

+0

私はまったく同じ問題を抱えていました。すべてが正しかったが、うまくいかなかった。それをターゲットに含めてチェックマークを外してビルドしました。それから私はチェックマークを付け加えて、もう一度ビルドし、それは働いた。このバグは3歳です。ありがとう。 – LostInTheTrees

7

はい、これを行うことができます。おそらく.mをあなたのプロジェクトにコンパイルしていないでしょう。

+0

"プロジェクトで.mをコンパイルしていません"?これは.hファイルの横にある。 – Inferis

+0

@Inferis - 確かに、あなたが得ているエラーは、コードが実行されているときに.mファイルに定義されているコードが存在しない、つまりロードされていないか、何かスペルミスがある、最初からコンパイルされています。 –

+0

さて、どうすれば強制的にコンパイルできますか? – Inferis

0

あなたは間違いなくそれを行うことができます。私は何か間違っていると推測しています@implementation UIColor(Hex)

1

あなたはできるが、メソッド(インスタンスまたはクラス)をフレームワーククラスに追加する際は非常に注意が必要です。同じ名前で異なるセマンティクスを持つメソッドがどこにも存在する場合、エフェクトは未定義です。特に、同じ名前のプライベートシステムフレームワークメソッド、または将来のOSリリースで追加されるかもしれない(最悪の場合)入力マネージャ、カラーピッカーなどの他のバンドルによって追加される可能性がありますコード注入メカニズム。これは実生活で起こる実際の問題です。

これを修正するには、基本的に2つの方法があります。1)Do not Do(たとえば、標準のC関数を使用する)、2)プレフィックスを使用して名前を競合させる可能性を減らす方法クラス名に - たとえば、inferis_colorWithHex:

+0

見て、私は危険を知っています。私はちょうどそれが動作しない理由を知りたい。 ;) – Inferis

+0

@ジョー:クール、その技術を知らなかった。 – Inferis

+0

+1 "it's cowboy yet cool"のコメント、heh – donkim

0

このメソッドを呼び出すクラスで.hファイルをインポートしましたか?また、すべての.mファイルがターゲットに含まれているかどうかを確認してください。

2

"その他のリンカフラグ"設定で-ObjC-all_loadリンカフラグを追加する必要があります。

0

あなたが作業スペースでCocoaPodを使用していて、use_frameworks指示文を指定している場合、他のフレームワークのカテゴリソースコードが取得されるかどうかに影響するようですロードされる。

関連する問題