No.-forwardInvocation:
は、メッセージ転送メカニズムの一部として使用されます。メッセージ転送について心配する必要はありません。実際にはプロキシ オブジェクトによってのみ使用され、使用する必要がなく、使用していることを知っている可能性が高いからです。
-performSelector:
メッセージの戻り値の型が互換性があると仮定するid
ため、戻り値の型が異なるメッセージを送信するために使用される場合 (たとえば、long long
32 ビット システムの a などのポインターより幅が広い、または異なるレジスタ/アドレスを介して返される) を使用する場合は安全ではありませんafloat
または largeなどstruct
)。
そのようなメッセージを間接的に送信したい場合は、クラスのインスタンスを作成してから送信できます。戻り値は呼び出しオブジェクトに格納され、呼び出しオブジェクトを介してアクセスできます。は、このシナリオでは使用されません。NSInvocation
-invoke
-forwardInvocation:
一般的に言えば、 を使用して-performSelector:
いることに気付いた場合、おそらくアンチパターンに対処している可能性があります。この場合、ClassA
正式には知らないメッセージを送信しようとしています。別の解決策は、これらのプライベート メソッドを公開することです。
と の両方を所有している場合ClassA
は、使用するプライベート メソッドを含む のClassB
「プライベート」ヘッダーを作成できます。ClassB
他の誰か (Apple など) が を所有しClassB
ている場合、文書化されていない API を扱っていることになり、Apple はそのような API を使用するアプリを拒否するため、別のアプローチを探す必要があるかもしれません。
プライベート ヘッダーを作成するには、Xcode に移動し、新しいヘッダー ファイルを作成します。「ClassB+Internal.h」または「ClassB+PrivateMethodsForMeOnly.h」のような名前を付けます。あなたのプロジェクトにとってプライベートなものとして扱ってくださいClassB
。この新しいヘッダーに、次を追加します。
#import "ClassB.h" // so we get the original class definition
@interface ClassB (PrivateMethodsForMeOnly)
- (double)someMethod;
- (const struct low_level_c_type_t)otherMethod:(int)i;
// etc. etc. etc.
@end
そしてClassA.m
(これらのメソッドを使用するすべての人に公開したくない 場合を除いて)、include セクションに次の行を追加します。ClassA.h
ClassA
#import "ClassB+PrivateMethodsForMeOnly.h"
ClassA
その後、新しいカテゴリのこれらのメソッドにアクセスできます。