2011-11-08 83 views
1

我收到警告:實例方法'method'正在'Class'上使用,它不在根類。Objective-C:實例方法'方法'正在'Class'上使用,它不在根類中

我在靜態方法中調用此方法(它是在超類中定義的)。當我執行代碼時,我得到運行時錯誤:無法識別的選擇器發送到類

有沒有可能解決這個問題?是否有可能在靜態方法內調用超類方法?

謝謝

編輯

子類:

@interface ProfileClass : GHAsyncTestCase {} 
+ (void)testGHUnitSuccess; 
@end 

@implementation ProfileClass 
+ (void)testGHUnitSuccess { 
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:10.0]; 
} 
@end 

GHAsyncTestCase是GHUnit框架類。也許,用靜態方法調用超類方法是不可能的。如果不是,我將不得不以不同的方式解決它。

SOLUTION

我已經創建了我的超類的共享實例,並在靜態方法使用它。

+2

我們需要查看您的代碼才能理解任何內容。 – BoltClock

回答

3

簡單的答案是否定的。

要調用實例方法,您必須有一個類的實例來發送消息。在靜態方法中,您沒有該類的實例。

因此,您需要將被調用的方法轉換爲靜態方法 - 如果該方法不依賴於實例的任何值,或者您必須創建類的實例(alloc,init等)在靜態方法中。

我們不能提供一個更具體的出路而不看你的代碼。

編輯: 編輯後,可以看到問題是什麼。
在類方法中(+(void)testGHUnitSuccess - 注意不是靜態方法)self是沒有實例方法的類。 因此,正如你所說的,你需要用類的一個實例替換自己 - 在這種情況下是一個共享實例。

+0

我已經使用我的父類的SharedInstance解決了它 –

+2

「在類方法中...自我沒有定義,因此您發送的消息爲零。」錯誤。發送給'nil'的消息不會導致無法識別的選擇器異常。所有Objective-C方法都定義了「self」*;在類方法中,'self'是消息發送的類。 – jlehr

相關問題