尝试编写一些在iOS和OS X之间工作的通用库。 为了不通过在代码中放入大量 #if TARGET_OS_IPHONE 来使应用程序混乱,我想我将能够使用通用的 .h 对 UIFont 和 NSFont 进行子类化,并且只需为每个构建使用单独的 .m 文件。 所以我有以下子类结构MyFont.h和MyFont_iOS.m和MyFont_OSX.m。每个目标都包含相应的 .m 文件。 在iOS上工作正常,但是在OSX上执行时,我得到一个EXC_BAD_ACCCES创建字体对象
,例如MyFont *myFont = [MyFont fontWithName:@"Arial" size:132.0];
我可以不对NSFont进行子类吗?
这是我对 NSFont 子类的基本代码示例(请注意,截至目前,我在子类中没有专门的代码。这只是一个基本的子类)
我的字体
#if TARGET_OS_IPHONE
@interface MyFont : UIFont
#else
@interface MyFont : NSFont
#endif
@end
MyFont_iOS.米
#import "MyFont.h"
@implementation MyFont
@end
MyFont_OSX.米
#import "MyFont.h"
@implementation MyFont
@end
尝试使用子类化字体(在iOS应用程序中 - 工作正常!
#import "MyFont.h"
...
MyFont *myFont = [MyFont fontWithName:@"Arial" size:45.0];
尝试使用子类化字体(在OS X应用程序中 - 崩溃!
#import "MyFont.h"
...
MyFont *myFont = [MyFont fontWithName:@"Arial" size:132.0];
仅供参考 - 我也收到此行的警告
使用类型为"NSFont *"的表达式初始化"MyFont *"的不兼容指针类型
所以我肯定做错了什么,但只是不明白为什么它迫使我使用 NSFont,但在 UIFont 上运行良好。
感谢您的任何指导!
fontWithName 返回 NSFont/UIFont - fixed。它不能被子类化
即使它有效,它也不是定义的行为
您可以做的是拥有一个包含平台特定字体的包装器
例如
@implementation MyFont {
PlatformSpecificFont *_font
}
+ (instancetype)fontWithName:... {
_font = [PlatformSpecificFont fontWithName:...];
return self;
}
包装器是执行此操作的好方法。另一种选择:根据目标,要么
#define MyFont NSFont
或
#define MyFont UIFont
如果两者都需要不同的代码,则可以向类添加扩展。