CATextLayer中的NSAttributedString导致EXC_BAD_ACCESS(ios 5.0)

时间:2013-04-04 14:51:07

标签: ios ios5 core-text nsattributedstring quartz-core

我很难与CoreText合作。 不知道,如果我做错了什么,或者它是不是iOS'自己的错误,但这里有我所拥有的: 在iOS 5.0中,此代码在显示视图时使应用程序崩溃

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIFont * font = [UIFont systemFontOfSize:[UIFont systemFontSize]];

    NSDictionary * attrs = @{(NSString *)kCTFontAttributeName:font};

    NSAttributedString * attrStr = [[NSAttributedString alloc] initWithString:@"Test" attributes:attrs];

    CATextLayer * textLayer = [[CATextLayer alloc] init];

    textLayer.frame = self.view.frame;

    textLayer.string = attrStr;

    [self.view.layer addSublayer:textLayer];
}

它生成EXC_BAD_ACCESS并打开CoreText TAttributes::TAttributes(__CFDictionary const*):,显示发生异常的汇编程序行。

我做错了吗?我挣扎了近8个小时,仍然不知道发生了什么。

更新

似乎问题是以某种方式基于这一行

    NSDictionary * attrs = @{(NSString *)kCTFontAttributeName:font};

因为当我删除Font属性并添加ForegroundColor属性时,它突然开始工作。我会尝试深入挖掘,但仍希望得到一些帮助。

2 个答案:

答案 0 :(得分:3)

如果您直接使用Core Text,则必须使用CTFont,而不是UIFont。它们相互兼容(即它们之间没有免费的桥接)。

我花了一整天时间发现这个。我的问题就像你现在所经历的那样!

不幸的是,很棒的NSAttributedString东西只是iOS 6。因此,如果您想制作多字符串并在iOS 5中显示它,那么您所做的就是正确的。但您必须仅使用与iOS 5兼容的电话。

这是一些典型的代码,用于制作与CoreText一起使用的NSAttributedString,并且可以在iOS 5上由CATextLayer显示:

https://github.com/mattneub/Programming-iOS-Book-Examples/blob/master/iOS5bookExamples/ch23p689styledText1/p579p593styleText1/RootViewController.m

答案 1 :(得分:0)

EXC_BAD_ACCESS异常是内存问题,通常是对象(早期)发布问题,即访问已释放的对象。

如果您没有打开NSZombies,请执行此操作然后重试。这里肯定有很多与他们有关的帖子。