2012-01-13 57 views
2

在我工作的應用程序中,我經常發現這樣的代碼行如何調用委託函數而不在ios中獲取「實例方法未找到」警告?

[delegate aFunction];

生成的「實例方法‘機能缺失’找不到(返回類型默認爲ID)」警告

現在,我做了所以有點研究,結果發現,該警告可以通過刪除當你在self([self aFunction];)上調用它時聲明函數的功能,但是當我使用委託時,沒有任何答案對我的案例提出任何意見。

因此,長話短說,我能做些什麼來正確調用另一個類中的委託方法? 事情似乎正常工作,所以這不是一個主要問題,但警告意味着我沒有做一些完全正確的事情,所以我想知道這種情況下的最佳做法

感謝您的幫助提前!

@class SomeClass; 
@protocol SomeClassDelegate <NSObject> 
@required 
- (void)thisObjectDidSomething:(SomeClass*)instance; 
@optional 
- (void)thisObjectDidSomethingUnimportant:(SomeClass*)instance; 
@end 

那麼你的委託伊娃和財產看起來就像這樣(使用指定的弱,如果不是:

+0

嘿男人。下面提供了第二個答案。 – beOn 2012-01-13 13:40:50

回答

8

所以,如果我理解正確你,你的問題可以通過聲明的協議如下帶走你不使用ARC):

@interface SomeClass() { 
    __weak id<SomeClassDelegate> delegate_; 
} 
@property (weak) id<SomeClassDelegate> delegate; 

而且在那將執行該協議的任何類的.h文件,這樣做:

@interface TCReader : NSObject <SomeClassDelegate> { 

} 

因爲它是安全的呼籲無選擇,對於需要的方法,你可以:

[self.delegate thisObjectDidSomething:self] 

但可選的方法,你最好:

if ([self.delegate respondsToSelector:@selector(thisObjectDidSomethingUnimportant:)]) { 
    [self.delegate thisObjectDidSomethingUnimportant:self] 
} 

,這裏的要點是,通過聲明和使用協議,讓XCode知道這些方法是爲實現協議的對象定義的。如果你需要你的委託實現該協議,那麼Xcode知道你的委託具有定義的那些方法。

+0

哇,這是一個很好的答案,它解釋了很多!我會嘗試去實現它,看看它是否有效 – BBog 2012-01-13 14:12:59

+0

請注意,如果你已經完成了所有這些工作,並且你正在訪問委託作爲另一個類的屬性,並且你還*得到了這個警告,那麼你可能只是需要在引用它的類中導入定義委託的頭。 (例如'#import「SomeClassDelegate.h」') – 2016-05-12 16:34:33

相關問題