我想创建一个依赖于模型的给定实例的类的控制器
-(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;
}
我想找到一个更灵活的解决方案,并想拥有一本字典,该字典将模型类映射到控制器类,然后
NSClassFromString
可以给我正确的实例。我的问题是:如果我多次使用
NSClassFromString
,它是否会大量使用我的应用程序性能(例如,一次使用100次)?还是会和上述方法一样快? 最佳答案
类是一个ID,因此可以添加到NSDictionary中。您应该尝试以下方法:
mModelToControllerMap = [[NSDictionary alloc] initWithObjectsAndKeys:
[ConcreteController1 class] , [ModelClass1 class] ,
[ConcreteController2 class] , [ModelClass2 class] ,
...
nil];
然后再:
controllerClass = [mModelToControllerMap objectForKey:[modelInstance class]];
if ( controllerClass ) ...
else ...
如果将其设为可变字典,则可以让控制器为所需的模型注册,而不是强制基类知道所有派生类。
并直接回答。最糟糕的是,NSClassFromString可能需要遍历所有类以找到匹配项。它也可以是字典查找,但是该实现未记录在文档中,因此不应依赖。虽然执行几百次可能还不错,但是有更好的方法。
关于iphone - NSClassFromString是否会影响性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2915223/