我希望能够有两个类负责以不同的方式响应选择器,具体取决于平台是 iOS 还是 OSX。
但是,我想要只使用一个类的代码,并且我想避免重复#ifdefs。
理想情况下,我希望有 3 个课程:
- 通用类
- iOS 特定类
- OSXSpecificClass
iOSSpecificClass
并且OSXSpecificClass
都扩展了 UniversalClass。所有调用都将在 UniversalClass 上完成,该类负责调用 和 的相应iOSSpecificClass
方法OSXSpecificClass
。
我想出了两个解决方案:
@interface UniversalClass : NSObject
+ (void) universalMethod;
@end
@implementation UniversalClass
+(id)forwardingTargetForSelector:(SEL)aSelector {
#if TARGET_OS_IPHONE
return [iOSSpecificClass class];
#else
return [OSXSpecificClass class];
#endif
}
@end
这种方法的问题是UniversalClass
在 .h 中承诺了可以或不能交付的东西。警告也告诉我们这一点。Grr。警告。
第二种方法是这样的:
@implementation UniversalClass
+ (Class)correctClass {
Class aClass = Nil;
#if TARGET_OS_IPHONE
aClass = [iOSSpecificClass class];
#else
aClass = [OSXSpecificClass class];
#endif
return aClass;
}
+ (void)universalMethod {
Class masterClass = [UniversalClass correctClass];
[masterClass universalMethod];
}
@end
这种方法的问题是我必须对我添加的每个方法进行更改,我觉得我有点重复自己而不需要。
在这两种解决方案中我必须注意哪些边缘情况?还有比这些更好的解决方案吗?