2012-06-06 50 views
1

我在Objective C中很新手,雖然我有一些Java反射背景。查找類方法的選擇器

在這裏,我有一個經典的類方法findAll,它可以從數據庫中找到所有的域對象。類UNIVERS直接繼承的domainObject

@interface DomainObject : NSObject 

    - (NSString *) execute : (NSString*) method withJson:(NSString*)json; 
    + (NSString*)findAll: (NSString*)json; 

@end 

@implementation DomainObject 

    - (NSString *) execute: (NSString*) method withJson:(NSString*)json{ 

     method = [NSString stringWithFormat:@"%@%@", method, @":"]; 
     //method is 'findAll:' 
     NSString* result = [ self performSelector: 
      NSSelectorFromString(method) withObject:json];// Error here 
     return result;  
    } 
@end 

的代碼是工作時的findAll不是一個類的方法(即-findAll聲明),但現在我有錯誤:NSInvalidArgumentException - [UNIVERS的findAll:] 很明顯,運行時正在尋找一個實例方法。

任何想法找到我的類方法?

回答

5

與其說

NSString* result = [self performSelector:NSSelectorFromString(method) withObject:json]; 

的需要調用

NSString* result = [[self class] performSelector:NSSelectorFromString(method) withObject:json]; 

類方法。

畢竟它是應該調用方法的對象實例的類,而不是實例本身。

簡短說明:NSObject實現- (Class)class;(!不要與類似的效果+ (Class)class,這NSObject器具被誤認爲,太),它返回的實例對象的Class對象。請記住,除了普通實例對象之外,在Objective-C中,類也是實際對象:Class類型的對象,即(與id,NSObject,...)對應。

請參閱-class方法here的文檔。


順便說一句,你應該換你的方法調用到一個條件塊,以防止因調用缺少方法例外。

SEL selector = NSSelectorFromString(method); 
if ([[self class] respondsToSelector:selector]) { 
    NSString* result = [[self class] performSelector:selector withObject:json]; 
} 

通常它是在目標C的共同圖案通過經由[object class]接收類對象來調用對象的類的方法。

考慮這種情況下,一個名爲Foo實施返回自己的一個autporeleased實例的便捷方法類(通過調用:Foo *newFoo = [Foo foo];):

雖然這肯定會是可能實現該方法是這樣的(後我們只知道對象的類名,對吧?):

+ (id)foo { 
    return [[[Foo alloc] init] autorelease]; 
} 

正確的做法是這樣的:

+ (id)foo { 
    return [[[self alloc] init] autorelease]; 
} 

作爲第一個將導致在子類與多態的問題(如一個名爲FooBar子類,爲它顯然應該[FooBar alloc] …,不[Foo alloc] …。幸運的是[[self class] alloc]動態地解決了這個問題)。 雖然這顯然不是徹底解釋這個問題的恰當地方(相當偏離主義者可能會這樣說),但肯定值得注意/警告,恕我直言。

+0

我不認爲對初學者的很好的解釋是offtopic :) –

+0

'return [[[[self class] alloc] init] autorelease];'應該是'return [[[self alloc] init] autorelease] ;'。 '[self class]'和'self'完全一樣mehtod – user102008

+0

@ user102008:你是對的。我責備複製和粘貼。 ;)修正。 – Regexident