2012-01-13 49 views
14

電弧遷移工具被拒絕接受此代碼與遷移開始前:如何在遷移到ARC時解析「沒有已知的選擇器實例方法performSelector:withObject:afterDelay:'」?

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

委託是被迫實施此方法的協議,並且它應該很好地工作:

@protocol OverlayDelegate <NSObject> 
- (void)overlayDismissed:(Overlay*)overlay; 
@end 

@interface Overlay : UIImageView { 
    id<OverlayDelegate> delegate; 
} 

@property (nonatomic, assign) id<OverlayDelegate> delegate; 

ARC有什麼問題?爲什麼它告訴我,「沒有已知的選擇器實例方法」performSelector:withObject:afterDelay:'?

回答

16

ARC沒有造成這種情況 - 它只是暴露它。該方法在NSObject上定義 - 但ID工程不僅僅是NSObject的(所以你必須不只是「身份證」更具體的),更你的代碼改成這樣:

@interface Overlay : UIImageView { 
    NSObject<OverlayDelegate> *delegate; 
} 

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate; 
+0

那麼這意味着在ARC之下,我們宣佈代表作爲id的日子已經過去了嗎?簡單地依靠NSObject而不是? (對我而言,無論如何都是有意義的) – openfrog 2012-01-13 01:37:40

+1

ARC爲了內存管理的目的強制執行這些事情。如果你知道你的委託將是NSObject類型的 - 那麼就說明這一點,這個問題就會消失。 – dtuckernet 2012-01-13 01:38:40

+0

或者仍然使用'id',只是不要使用'NSObject'中的方法。無論如何,你爲什麼要用'NSObject'的方法?這裏有要求嗎? – mattjgalloway 2012-01-13 01:43:13

0

我已經想通了,鑄造委託NSObject的*解決問題:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0]; 

由於一些奇怪的原因,自動完成甚至沒有出現w ith -performSelector:withObject:afterDelay:所以我不得不手動鍵入它。相反,它僅提供-performSelector:-performSelector:withObject:withObject:

我的猜測是,它只是愚蠢的使用ID爲在Objective-C代表的類型,我從來沒有真正知道爲什麼每個人,包括我自己是這樣做,而不是僅僅將其定義爲NSObject的。但是,我的協議甚至告訴任何符合該協議的人也必須遵守NSObject協議:OverlayDelegate <NSObject> - 但編譯器仍然沒有得到它。

所以現在我很滿意它與演員合作,但感覺就像在吃老魚。

+0

注意:輸入我的答案時,出現一條消息,表示答案已由dtuckernet發佈。所以他更快。 – openfrog 2012-01-13 01:38:51

+2

這是因爲'performSelector:withObject:afterDelay:'是在'NSObject'上定義的類,而不是'NSObject'協議。這就是爲什麼它錯誤(在ARC下)並沒有出現代碼完成。 – mattjgalloway 2012-01-13 01:41:37

+0

現在完全感覺。 – openfrog 2012-01-13 01:44:57

3

很簡單,您的對象是id類型,並且符合NSObject協議。然而,這個協議並沒有聲明performSelector:withObject:afterDelay:,所以ARC不知道該方法在做什麼以及它是否必須保留任何東西。在進行方法調用之前使用NSObject或進行強制轉換。

0

我遇到錯誤:

No known class method for selector conformsToProtocol:

的原因是:文件名不等於類名@interface@implementation

相關問題