NSInvocation Objective-C

請參閱本的原貼e.James

根據 Apple 的 NSInvocation 類引用

NSInvocation 是一個靜態呈現的 Objective-C 訊息,也就是說,它是一個變成物件的動作。

而且,更詳細一點

資訊的概念是客觀 c 哲學的核心。每次呼叫方法或訪問某個物件的變數時,都會向其傳送訊息。當你想要在不同的時間點向物件傳送訊息或者多次傳送相同的訊息時,NSInvocation 會派上用場。NSInvocation 允許你描述要傳送的訊息,然後稍後呼叫它(實際上將其傳送到目標物件)。

例如,假設你要將字串新增到陣列中。你通常會傳送 addObject:訊息,如下所示:

[myArray addObject:myString];

現在,假設你想使用 NSInvocation 在其他時間點傳送此訊息:

首先,你準備一個 NSInvocation 物件用於 NSMutableArrayaddObject:選擇器:

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];

可以想象它就像傳送電子郵件一樣。你開啟一個新電子郵件(NSInvocation 物件),填寫要將其傳送給的人(物件)的地址,鍵入收件人的訊息(指定 selector 和引數),然後單擊傳送 (叫 invoke)。

有關更多資訊,請參閱使用 NSInvocation

NSUndoManager 使用 NSInvocation 物件,以便它可以反轉命令。基本上,你正在做的是建立一個 NSInvocation 物件來說:“嘿,如果你想撤消我剛剛做的事情,請將這個訊息傳送到該物件,並使用這些引數”。你將 NSInvocation 物件提供給 NSUndoManager,並將該物件新增到可撤消運算元組中。如果使用者呼叫 Undo,則 NSUndoManager 只查詢陣列中最近的動作,並呼叫儲存的 NSInvocation 物件來執行必要的操作。

有關更多詳細資訊,請參閱註冊撤消操作