2010-02-26 21 views

回答

15
Class klass = NSClassFromString(classname); 
if ([klass instancesRespondToSelector:@selector(create)]) { 
    [[klass alloc] create]; 
} 

但是,我可以指出你做了多少次糟糕的Objective-C規則嗎?例如,您不應該在已分配但未初始化的實例上調用方法。 Xcode靜態分析器會給你關於內存泄漏的各種警告。

一個更好的辦法是這樣的:

[[[klass alloc] init] create]; 

但你似乎暗示你不想調用初始化。

您可以考慮一個類方法:[klass create],它將返回一個非擁有的klass實例。然後你只需在調用它之前檢查[klass respondsToSelector:@selector(create)]

+1

謝謝。你是對的,Create方法應該是一個類方法。 我認爲這通常是如何設計對象工廠的。 – Jacko

+1

這不是最好的答案。 Chuck更好。 – rafaperez

253
NSString *className; //assume this exists 
Class class = NSClassFromString(className); 
if ([class conformsToProtocol:@protocol(SomeProtocol)]) { 
    id instance = [[class alloc] init]; 
    [instance create]; 
} 
+0

很酷。感謝您的建議。 – Jacko

+66

這沒有標記爲答案? – Sam

+7

他在他的標題中問了兩個問題:) – ctpenrose

相關問題