2017-02-06 4 views

答えて

5

NSMutableCopyingを実装する事がちょうど-mutableCopyのための実装を繰り返す必要がなく-mutableCopyWithZone:を実装するために得るようにNSObject自体は(-mutableCopyWithZone:に呼び出すことによって、(たとえそれらNSCopyingまたはNSMutableCopyingに適合しない、すべてのオブジェクトの)-mutableCopyを実装しているためこれは、 )。 NSObjectから継承

すべてが-mutableCopyに応答しますが、あなたが実際にそれを呼び出した場合NSNumber-mutableCopyWithZone:に応答しないので、それがクラッシュしていました。あなたは

assert([NSObject instanceMethodForSelector:@selector(mutableCopy)] == [NSNumber instanceMethodForSelector:@selector(mutableCopy)]) 
でこれを見ることができます

bbumの分析はかなりよく、これをまとめたもの - 動的にこれらのチェックを行っているとき、あなたがまったく期待していない答えを得る可能性があるため、いくつかの微妙なエッジの場合があります。

+1

どこから来たのかをおねがいします。 – bbum

+1

素晴らしい情報NSObjectのドキュメントを見ていれば、これはNSMutableCopyingプロトコルを採用したクラスにとって便利なメソッドです。 mutableCopyWithZoneの実装がない場合は例外が発生します:。 –

+0

@BenFlynn Haha、私は半分しか自分自身を思い出しました。これは、コードやドキュメンテーションで簡単に発見できる機能ではありません。 –

4

。私はクラスが-mutableCopyを実装するとは思わないでしょう。もしタグがあれば、@(REALLYBIGNUMBERTHATIS​​NEARMAX)が振る舞いを変えるでしょう)。

一般的な機能テストにはrespondsToSelector:を実際に使用できないという微妙な教訓があります。 isKindOfClass:も使用できません。それが失敗する多くの状況があります(NSArrayNSMutableArrayは、非常に奇妙に動作するために使用されました。たとえば、イントロスペクションを使用して変更可能性を判断しようとする場合など)。

イントロスペクションは、委任またはデータソースなどの明示的に宣言された状況でうまく機能します。特定のセットの@optionalメソッドを定義する@protocol宣言がある場所。

関連する問題