【发布时间】:2011-04-23 15:27:54
【问题描述】:
我正在开发一个通用的 iOS 应用程序。在大多数情况下,我一直通过创建子类来处理设备差异,因此 RootViewController 是 RootViewController-iPad 和 RootViewController-iPhone 的子类。模式从 main.m 开始,我在其中进行设备检测,如下所示:
int retVal;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
retVal = UIApplicationMain(argc, argv, nil, @"SalesPadAppDelegate_iPad");
} else {
retVal = UIApplicationMain(argc, argv, nil, @"SalesPadAppDelegate_iPhone");
}
这种模式运行良好,并且最大限度地减少了代码重用。
在堆栈的更下方,我有一系列继承自通用超类 MasterDetailViewController 的视图控制器。这个超类需要一些特定于设备的代码,所以我正在考虑对其进行子类化,然后让超类自动分配或实例化最合适的设备特定子类。
在实现方面,如下所示:
+(id)allocWithZone:(NSZone *)zone {
if ([[self class] isEqual:[MasterDetailViewController_iPad class]] || [[self class] isEqual:[MasterDetailViewController_iPhone class]]) {
return [super allocWithZone:zone];
} else {
if ([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone) {
return [MasterDetailViewController_iPhone allocWithZone:zone];
} else {
return [MasterDetailViewController_iPad allocWithZone:zone];
}
}
}
此代码不起作用,是一种概念演示。有没有办法做我想做的事,还是我看错了?
编辑:为了清楚起见,超类和子类之间的数据是相同的。唯一的区别是几个方法实现。这个想法是子类化比设备特定的意大利面条代码更干净。
【问题讨论】: