Xcode 6.3(和6.2)在[UIFont fontWithName:size:]

时间:2015-04-26 06:00:43

标签: ios objective-c iphone xcode xcode6

在我的iOS应用程序中使用类(DKTheme)将我的字体和图像保存在一个集中的位置。我的实现看起来像这样。

+ (instancetype)theme {
    static DKTheme *_theme = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _theme = [[DKTheme alloc] init];
    });
    return _theme;
}

- (id)init {
    self = [super init];
    if (self) {
        [self setupTheme];
    }
    return self;
}

- (void)setupTheme {
// some code here
self.smallButtonFont = [UIFont fontWithName:@"Helvetica-Bold" size:13.0f];
//some code here
}

当我在设备(iPhone 5C,iOS8.3和iOS8.2)中运行此代码时,如果我单击继续执行按钮,xcode将在self.smallButtonFont = [UIFont fontWithName:@"Helvetica-Bold" size:13.0f];行上遇到断点,应用程序继续运行而不会崩溃,我的字体property(self.smallButtonFont)已成功初始化。

Breakpoint

Call Stack

我注意到了另一件事,我有几次[UIFont fontWithName: size:];次调用和断点点击只是第一次调用。(如果我评论第一次,那么下一次方法调用就会触及断点)。这真的很烦人这个断点问题,任何帮助都会感激不尽。

5 个答案:

答案 0 :(得分:22)

您已在Xcode中添加了断点异常,并将其配置为在所有异常类型(C ++和Objective-C)上中断。问题是C ++代码有时会在非异常情况下使用异常。它可以用它作为一种流量控制或返回"失败"来自一个功能。

除非您有一个需要调试的特定C ++异常,因为它实际上导致了问题,否则最好将该断点配置为打破Objective-C异常而不是C ++异常。可以安全地忽略C ++异常。

答案 1 :(得分:5)

添加All Exceptions断点时总是会发生这种情况。在这里,您只需要添加objective-c断点。 请按照以下步骤操作:

  1. 选择Breakpoints调试器,右键单击“All Exceptions”。
  2. enter image description here

    1. 现在选择点击“编辑断点”

    2. 将异常类型更改为“Objective-c Exception”

    3. enter image description here

答案 2 :(得分:1)

起初。当然这是异常断点。您可以在" Breakpoints选项卡"中添加或删除它。我的截图可以帮助您。

enter image description here

产生此异常的原因:

iOS中有一些默认字体。如果您尝试生成喜欢不可用的字体名称。你看到这样的例外。也许在你的代码中你使用另一个字体名称。我的意思不仅仅是@" Helvetica-Bold"。现在你有一个问题:我现在怎么样,我的操作系统中是否有字体可用。您可以使用此方法打印所有可用字体:

- (void)fontsList
{
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSArray *fontNames;
    NSInteger indFamily, indFont;
    for (indFamily=0; indFamily<[familyNames count]; ++indFamily) {
        NSLog(@"Family name: %@", [familyNames objectAtIndex:indFamily]);
        fontNames = [[NSArray alloc] initWithArray:[UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];
        for (indFont=0; indFont<[fontNames count]; ++indFont) {
            NSLog(@"    Font name: %@", [fontNames objectAtIndex:indFont]);
        }
    }
}

祝你好运。如果您还有这个问题,请添加一些信息。

答案 3 :(得分:0)

如果不是你设置了一个断点 - 它可能与在init中调用方法有关。 unsafe calls to self

另见我关于font caching and loading的说明。

答案 4 :(得分:0)

我也有这个问题,并在不改变断点设置的情况下解决了这个问题。在我的情况下,问题是我的应用程序有一个框架,其info.plist文件列出了一个提供的字体,该应用程序本身也列为提供的字体(在Fonts provided by application中)。删除副本修复了此问题。