2011-08-26 86 views
0

如果你有一個類對象,有一種方法可以用它來調用該類的類方法。例如,如果你有+ (void)foo定義你怎麼能實現像下面的例子中沒有編譯器警告說,它不能找到方法foo方法A類:Objective C:有沒有辦法在沒有編譯器投訴的情況下調用類對象的類方法?

A* object = [[A alloc] init]; 
id objectClass = [object class]; 
[objectClass foo]; // complains that the method is not found 
+0

請發佈實際的接口文件(.h),您正在進行此調用的代碼以及實際的編譯器輸出。這應該工作。 – Flyingdiver

+0

確保在* interface *和* implementation *中都有方法'foo'前的'+'。 – EmptyStack

+0

對不起,我急於發貼。請參閱上面的編輯。 – Mattia

回答

1

創建你的.h類方法:

MyClass.h

@interface MyClass : NSObject {  
} 
+(void) test; 

@end 

MyClass.m

@implementation MyClass 

-(id) init 
{ 
    self = [super init]; 

    return self; 
} 

+(void) test 
{ 
    NSLog(@"Test executed"); 
} 

@end 

然後你可以叫它像這樣:

MyClass* myClass = [[[MyClass alloc] init] autorelease]; 

[[myClass class] test]; 

編輯:

如果問題是編譯器警告,只需創建一個@protocol定義要調用foo的方法。 而不是通話:

id objectClass = [object class]; 

試試這個;

id<MyProtocol> myCastedObject = (id<MyProtocol>)object; 
[myCastedObject class] foo]; 
1

我只是跑使用一個快速測試我的課程,並能夠使你的語法工作。 你收到了什麼錯誤? 什麼你基本上的方式做的是

[A foo]; 

調用類的靜態成員。這隻適用於+符號標記爲靜態的方法。

+0

對不起,我過早發佈。我最終的問題是你如何讓編譯器不要抱怨。請看我上面的編輯 – Mattia

+0

啊,當我做了我的測試的時候,我使用了類名而不是objectClass,爲什麼你不這樣做?或者乾脆在上面做一個班輪? – box86rowh

+0

我給出的例子很有意思,而不是我真正想做的。在我的實際代碼中,我有一個不同類對象的數組,我必須調用一個類方法,所以不能使用類名。 – Mattia

2

您不必創建實例即可調用類方法。如果您必須致電實例方法,請創建實例。

方法A類的+ (void)foo應該被稱爲,

[A foo]; 
相關問題