刚刚发现,OC 中也有类似 Java 中的反射机制:
如下代码:
UIView *view =[[APLabel alloc] initWithNode:node];
可以改写为:
Class class= NSClassFromString(@"APLabel");
UIView *view =[[class alloc] initWithNode:node];
那么我们现有代码 UIFactory.m 中的 createViewFromNode: 函数只要稍加改造,就可以使代码更简洁,更易扩展。
1. 新建一个 plist 文件:ClassRegistry.plist
2. 对 createViewFromNode: 函数重写
- (UIView*)createViewFromNode:(NSDictionary *)node {
staticNSDictionary *dict = nil;
if(dict == nil) {
NSString*path = [[NSBundle mainBundle] pathForResource:@"ClassRegistry"ofType:@"plist"];
dict= [[NSDictionary alloc] initWithContentsOfFile:path];
}
NSString*tagName = [[node objectForKey:@"type"] lowercaseString];
NSString*className = [dict objectForKey:tagName];
Classclass = NSClassFromString(className);
return[[[class alloc] initWithNode:node] autorelease];
}