第-forwardInvocation:
被用作消息轉發機制的一部分。不要擔心郵件轉發,因爲它只能被代理對象使用,並且賠率很好,您永遠不需要使用它並知道您正在使用它。
-performSelector:
假定郵件的返回類型是id
或兼容,並且如果它是用來發送一個消息返回類型是不同的(例如,比指針更廣泛諸如long long
在32位系統中,以便並不安全,或通過不同的寄存器/地址返回,如float
或大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
(不ClassA.h
,除非你想公開這些方法大家誰使用ClassA
!)添加下面一行在包括部分:
#import "ClassB+PrivateMethodsForMeOnly.h"
ClassA
此後將有機會獲得在新的類別的那些方法。
注意-performSelector:withObject:同樣存在。 – NSResponder 2012-07-08 09:28:30