2008-11-24 25 views
15

我正在處理對象工廠以跟蹤對象的一個​​小集合。這些對象可以是不同的類型,但它們都會響應createInstancereset。這些對象不能從公共基類派生,因爲它們中的一些必須從內置的可可類派生,如NSViewNSWindowController如何將類名作爲參數傳遞給可可中的對象工廠?

我希望能夠通過傳遞所需的類名來我廠創建任何合適的對象的實例如下:

myClass * variable = [factory makeObjectOfClass:myClass];

makeObjectOfClass:方法會是這個樣子:

- (id)makeObjectOfClass:(CLASSNAME)className 
{ 
    assert([className instancesRespondToSelector:@selector(reset)]); 
    id newInstance = [className createInstance]; 
    [managedObjects addObject:newInstance]; 
    return newInstance; 
}

有沒有辦法將類名傳遞給方法,正如我上面makeObjectOfClass:(CLASSNAME)className參數所做的那樣?

爲了完整起見,這裏是我爲什麼要管理所有對象的原因。我希望能夠通過撥打[factory reset];來一次性重置一組完整的對象。

- (void)reset 
{ 
    [managedObjects makeObjectsPerformSelector:@selector(reset)]; 
}
+0

我之間邁克爾·蔡的和馬特·加拉格爾的答案撕裂。我提高了兩個,因爲都提到了'Class'的用法,這正是我所期待的。最後,我選擇了馬特的答案,因爲它強調了「類」在ClassFromString,這是第一個編輯之前提到使用「類」的。 – 2008-11-24 22:31:32

+0

@Ned Batchelder:謝謝你改變標籤。出於某種原因,「的ObjectiveC」顯示更多的項目(約200),比當我添加標籤的問題出現標籤的下拉列表「的ObjectiveC」,但我現在看到「的ObjectiveC」已經重定向以「Objective-C的」 – 2008-11-24 23:08:48

+0

@eJames:你的問題顯示-reset發送到實例,而不是類對象,所以我認爲[ACLASS respondsToSelector:@selector(復位)]在馬特加拉格爾的答案不正確。 – 2008-11-25 00:51:33

回答

22

您可以將字符串轉換爲使用功能的類:NSClassFromString

Class classFromString = NSClassFromString(@"MyClass"); 

在你的情況雖然,你會更好使用Class對象直接。

MyClass * variable = [factory makeObjectOfClass:[MyClass class]]; 

- (id)makeObjectOfClass:(Class)aClass 
{ 
    assert([aClass instancesRespondToSelector:@selector(reset)]); 
    id newInstance = [aClass createInstance]; 
    [managedObjects addObject:newInstance]; 
    return newInstance; 
} 
2

這聽起來像你想要的東西,如:

- (id)makeObjectOfClassNamed:(NSString *)className 
{ 
    Class klass = NSClassFromString(className); 
    assert([klass instancesRespondToSelector:@selector(reset)]); 
    id newInstance = [klass createInstance]; 
    [managedObjects addObject:newInstance]; 
    return newInstance; 
} 

這會假設名爲+createInstance一個類的方法。或者你可以使用[[klass alloc] init]

要叫它:

MyClass *variable = [factory makeObjectOfClassNamed:@"MyClass"]; 

取決於你正在試圖做的,它可能是更好的東西來繞過類對象不是字符串,如:

MyClass *variable = [factory makeObjectOfClass:[MyClass class]]; 
3

這是很容易動態地指定一個類,其實你可以僅僅通過它的名字引用它:其他

id string = [[NSClassFromString(@"NSString") alloc] initWithString:@"Hello!"]; 
NSLog(@"%@", string); 

一個提示,我一會由於大多數其他Cocoa程序員將它從Core Data讀取爲NSManagedObject,因此無法使用命名'託管對象'。你也可能發現使用全局NSNotification(所有你可重置的對象訂閱的)更容易,而不是管理一組不同類型的對象,但是你比我更知道做出這個決定。

3

答案從其他答案缺少的一點是,你可以定義一個@protocol包含您+createInstance+reset方法。

相關問題