2011-05-15 63 views
1

在Objective-C/Cocoa中如何發現我可以在委託類中實現的消息?我如何發現委託人可以/應該實現哪些消息?

從我在文檔中看到的一個類將只允許通過委託來處理某些選定的消息,但到目前爲止發現難以找到一個類的消息列表。

以另一種方式提出問題,如果我爲NSApplication創建了一個委託,哪些消息可供我處理?

爲的NSApplication文檔狀態委託

迴應代表NSApp表示的某些消息。

文檔接着前進到發言權

的NSApplication定義了二十委託方法,提供機會修改應用程序行爲的具體方面。

但據我所見,它沒有列出這些方法/消息,所以我怎麼知道哪些將從我的委託調用?

回答

2

委託是通常認爲的符合的協議,例如NSApplicationDelegate。如果尚未明確說明,您可以通過查看delegate屬性的類型(本例中爲id<NSApplicationDelegate>),經常查找相應協議的名稱。您可以查看文檔以獲取有關方法的詳細信息,或者在適當的頭文件中查看@protocol聲明,瞭解哪些方法可用以及哪些方法是必需的或可選的。

在某些情況下,對象未爲其代表定義協議,例如NSURLConnection。在這種情況下,您只需按照期望的代表的相關內容來學習該文檔。

在任何一種情況下,當向代理髮送消息以及任何消息的語義是完全取決於類。

+0

因此,如果班級文件稀少有關代表的信息,我應該搜索代表E.G.如果我想知道窗口委託可以實現哪些消息,我會搜索NSWindowDelegate? – 2011-05-15 21:29:18

+0

@Benjamin:這是通常的命名約定。更直接的方法是檢查'delegate'屬性的類型,因爲它通常會沿着'id '(意思是「任何符合FooDelegate協議的對象」)行。 – Anomie 2011-05-15 21:31:07

1

一個簡單的說明是,瞭解正式和非正式協議之間的區別是有用的。另外正式協議有可選方法,不需要調用。 當您編寫自己的協議時,您需要在發送可選/非正式方法之前檢查-respondsToSelector:。

正式協議定義如下......

@protocol SomeProtocol <NSObject> 
-(void)someMethod:(id)sender; 
-(void)someOtherMethod:(NSString*)aString; 
@property(nonatomic,retain) someProperty; 

@optional 
-(BOOL)someOptionalMethod; 

@end 

,並採用像...

@interface SomeClass : NSObject <SomeProtocol> { 

} 
@end 

這告訴你正在採用SomeProtocol編譯器,你不會被要求申報你在.h文件中的協議方法,它也告訴編譯器警告你,如果你沒有實現所有必需的方法。

對於非正式協議,您不會在語法上採用它們,但是您需要在.h文件中聲明您的方法。

+0

+1爲額外的信息,即使問題已經被關閉。謝謝。 – 2011-05-16 21:22:15

相關問題