iOS
NSInvocation
サーチ…
NSInvocation Objective-C
このオリジナルPostをe.Jamesによって参照してください
AppleのNSInvocationクラスリファレンスによると:
NSInvocation
は、Objective-Cメッセージが静的にレンダリングされたものです。つまり、オブジェクトに変換されたアクションです。
そして、 もう少し詳しく:
メッセージの概念は、客観的な考え方の中心です。メソッドを呼び出したり、オブジェクトの変数にアクセスしたりすると、メッセージを送信します。 NSInvocation
は、異なる時点でオブジェクトにメッセージを送信する場合や、同じメッセージを複数回送信する場合に便利です。 NSInvocation
では、送信しようとしているメッセージを記述してから、実際に呼び出す (実際には対象オブジェクトに送信する)ことができます。
たとえば、文字列を配列に追加するとします。通常、 addObject:
メッセージを次のように送信します。
[myArray addObject:myString];
ここで、 NSInvocation
を使用して、ある時点でこのメッセージを送信するとします。
まず、 NSMutableArray
のaddObject:
selectorで使用するNSInvocation
オブジェクトを準備します。
NSMethodSignature * mySignature = [NSMutableArray
instanceMethodSignatureForSelector:@selector(addObject:)];
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature:mySignature];
次に、メッセージを送信するオブジェクトを指定します。
[myInvocation setTarget:myArray];
そのオブジェクトに送信するメッセージを指定します。
[myInvocation setSelector:@selector(addObject:)];
そして、そのメソッドの引数を記入してください:
[myInvocation setArgument:&myString atIndex:2];
オブジェクト引数はポインタによって渡されなければならないことに注意してください。 Ryan McCuaigに指摘していただきありがとうございます。詳細はAppleのマニュアルをご覧ください。
この時点で、 myInvocation
は送信可能なメッセージを記述する完全なオブジェクトです。実際にメッセージを送信するには、次のように呼び出します。
[myInvocation invoke];
この最後のステップでは、メッセージが送信され、基本的に[myArray addObject:myString];
実行され[myArray addObject:myString];
。
電子メールを送信するように考えてください。新しい電子メール( NSInvocation
オブジェクト)を開き、送信先の人物(オブジェクト)のアドレスを記入し、受信者のメッセージを入力し( selector
と引数を指定)、[送信]をクリックします。 (呼び出しをinvoke
)。
詳細は、「 NSInvocationの使用 」 を参照してください。
NSUndoManager
はNSInvocation
オブジェクトを使用して、コマンドを逆にすることができます。基本的に、あなたがやっていることは、「ちょっと、私がやったことを元に戻したいのであれば、これらの引数を使ってこのメッセージをそのオブジェクトに送ります」と言うNSInvocation
オブジェクトを作成することです。 NSInvocation
オブジェクトをNSUndoManager
、そのオブジェクトを取り消し可能なアクションの配列に追加します。ユーザーが「元に戻す」をNSUndoManager
と、 NSUndoManager
は配列内の最新のアクションを検索し、格納されたNSInvocation
オブジェクトを呼び出して必要な処理を実行します。
詳細については、「 元に戻す操作の登録 」を参照してください。