0

尝试编写一些在 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 子类的基本代码示例(请注意,此时我在子类中没有专门的代码。这只是一个基本子类)

我的字体.h

#if TARGET_OS_IPHONE
@interface MyFont : UIFont
#else
@interface MyFont : NSFont
#endif
@end

MyFont_iOS.m

#import "MyFont.h"
@implementation MyFont
@end

MyFont_OSX.m

#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 上工作正常。

感谢您的任何指导!

4

2 回答 2

4

fontWithName 返回 NSFont/UIFont - 已修复。IT 不能被细分

即使它有效,它也不是定义的行为


您可以做的是拥有一个包含平台特定字体的包装器

例如

@implementation MyFont {
    PlatformSpecificFont *_font
}
+ (instancetype)fontWithName:... {
    _font = [PlatformSpecificFont fontWithName:...];
    return self;
}
于 2014-03-31T16:01:50.480 回答
1

Wrapper 是一个很好的方法。另一种选择:根据目标,要么

#define MyFont NSFont

或者

#define MyFont UIFont

如果两者都需要不同的代码,您可以向该类添加扩展。

于 2014-03-31T16:23:35.353 回答