我想创建一个依赖于模型的给定实例的类的控制器

 -(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/

10-09 16:25