[英]Does NSClassFromString affect performance?
我想創建一個依賴於模型的給定實例的類的控制器
-(BaseController *)getControllerForModel:(Model *)model
{
BaseController *controller = nil;
Class controllerClass = [BaseController class]; //the default value
//find the right controller
if ([model isMemberOfClass:[ModelClass1 class]])
controllerClass = [ConcreteController1 class];
else if ([model isMemberOfClass:[ModelClass2 class]])
controllerClass = [ConcreteController2 class];
else if ([model isMemberOfClass:[ModelClass3 class]])
controllerClass = [ConcreteController3 class];
...
else if ([model isMemberOfClass:[ModelClassX class]])
controllerClass = [ConcreteControllerX class];
else
Trace(TRACELEVEL_WARNING, @"Unrecognized model type: %@", NSStringFromClass([model class]));
//Now instantiate it with the model
controller = [[[controllerClass alloc] initWithModel:model] autorelease];
return slotController;
}
我想找到一個更靈活的解決方案,並想到有一個字典,它將Model-Classes映射到Controller-Classes,然后NSClassFromString
可以給我一個正確的實例。
我的問題是:如果我多次使用它(例如,一次100次), NSClassFromString
是否使用了我的大部分應用程序性能? 或者它會與上述方法一樣快?
通常,使用isMemberOfClass:
以這種方式表示架構問題。
在這種情況下,為什么各種Model
類不能簡單地實現+controllerClass
方法?
我可以理解尼古拉希望在沒有模型知道控制器的情況下維持控制器在模型之上的分層。 但是,我的經驗是,任何具有模型特定類型知識的控制層都會迅速破壞隔離; 模型層快速演變出控制器特定的行為。
因此,試圖維持這種分離所增加的復雜性是不值得的。
Class是一個id,因此可以添加到NSDictionary中。 您應該嘗試以下方法:
mModelToControllerMap = [[NSDictionary alloc] initWithObjectsAndKeys:
[ConcreteController1 class] , [ModelClass1 class] ,
[ConcreteController2 class] , [ModelClass2 class] ,
...
nil];
然后呢:
controllerClass = [mModelToControllerMap objectForKey:[modelInstance class]];
if ( controllerClass ) ...
else ...
如果你把它變成一個可變字典,你可以讓控制器注冊他們想要的模型,而不是強迫基類知道所有派生類。
並直接回答。 在最壞的情況下,NSClassFromString可能需要遍歷所有類以查找匹配項。 它也可以是字典查找,但實現沒有記錄,不應該依賴。 雖然這樣做幾百次可能並不太糟糕,但有更好的方法。
如果您真的關心性能,可以緩存NSClassFromString
的結果並將它們放在字典中。
另一方面,這可能是NSClassFromString
真正做的事情(地圖查找)。 所以我會說100x if方法要快得多。
但無論如何:只要試一試,就像所有性能問題一樣。
NSStringFromClass
不應該貴得多。 事實上,在您的情況下,您可以更有效地使用它。 我不知道你確切的類命名約定,但使用這樣的方法可能會更小更快:
NSString * modelClassName = NSStringFromClass([model class]);
// get the suffix of class name
// for example, '3' in 'ModelClass3'
NSString * suffix = [modelClassName substringFromIndex:10];
// create the controller name
NSString * controllerName = [NSString stringWithFormat:@"ConcreteController%@", suffix];
/* do something if name is not valid */
controllerClass = NSClassFromString(controllerName);
正如bbum建議你也可以在模型類的公共父級上創建一個方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.