2011-05-16 12 views
4

(我發現somequestions討論的想法,但我沒有看到我的問題的解決方案。)添加類方法NSObject的,但得到警告,因爲它不是在<NSObject>協議時,我把它稱爲

我將此便捷方法作爲NSObject的一個類別添加。 (我已經添加了其他方法,所以我仍然有興趣在回答中,即使你有這種特殊的便捷方法不以爲然。)

@implementation NSObject (MyCategory) 
- (void)performInvocationOnMainThread:(NSInvocation *)invocation waitUntilDone:(BOOL)waitForMainThread; 
@end 

然後,我有我定義了一個協議:

@protocol MyDelegateProtocol <NSObject> 
- (void)myDelegateProtocolMethod; 
@end 

然後我將該委託聲明爲實現所述協議的我的類的屬性。

​​

但是,當我嘗試調用NSObject的方法,我在類中添加像這樣

NSInvocation *invocation = [self.delegate invocationForSelector:@selector(someSelector:withArg:)]; 

我得到這樣的警告

'-performInvocationOnMainThread:waitUntilDone:' not found in protocol(s) 

如果我投我的委託作爲(NSObject *)後來我不要接受警告。我究竟做錯了什麼?似乎我沒有(或者應該?)將方法添加到現有協議中,而不創建「子協議」並從此開始使用它。 (哪一種失敗記添加方法NSObject中的點。)

NSInvocation *invocation = [(NSObject *)self.delegate invocationForSelector:@selector(someSelector:withArg:)]; 

回答

5

你的類擴展了NSObject,而不是NSObject協議。雖然課程現在有了這個方法,但它並沒有被定義爲協議的一部分,因此是警告。

這就是爲什麼類型轉換爲NSObject *指針類型的原因;您正在使用NSObject類類型,而不是類似id<NSObject>這意味着符合NSObject協議的任意Objective-C對象。

你必須做的一箇中間協議(或「子協議」),它擴展了NSObject協議:

@protocol ExtendedNSObject <NSObject> 
- (void)performInvocationOnMainThread:(NSInvocation *)invocation waitUntilDone:(BOOL)waitForMainThread; 
@end 

然後讓你的委託協議延長一個來代替:

@protocol MyDelegateProtocol <ExtendedNSObject> 
- (void)myDelegateProtocolMethod; 
@end 

如果我沒有錯,,你可以保留現有的NSObject (MyCategory)實現,他們會一起玩。

+0

此外,類別通常定義附加執行,這協議有無關。 – BoltClock 2011-05-16 21:25:09

3

當通/指望這種類型,限定它就像這樣:

- (void)race:(NSObject<MyDelegateProtocol>*)arg; 
相關問題