iOS: CTFramesetterCreateWithAttributedString вызывает EXC_BAD_ACCESS, есть предположения, почему? - PullRequest
0 голосов
/ 19 января 2012

Я создал метод для генерации атрибутивной строки из обычной строки.Значение attrString ниже является ненулевым и корректным по своему содержанию.

После запуска моего приложения вторая строка завершается с EXC_BAD_ACCESS.Есть идеи, почему?

Вызов __bridge_retained - это требование iOS 5.Я также пытался __bridge, но это не имеет никакого эффекта, проблема все еще возникает.

    NSMutableAttributedString *attrString = (NSMutableAttributedString*)[textLayer attributedString];
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge_retained CFMutableAttributedStringRef)attrString);

ОБНОВЛЕНИЕ

Если я это сделаю:

    NSMutableAttributedString *attrString = (NSMutableAttributedString*)[textLayer attributedString];
    NSLog(@"%@", attrString);
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFMutableAttributedStringRef)attrString);

Тогда строка NSLog не скомпилируется;Xcode выдает предупреждение и об ошибке "Incompatible pointer types passing 'char[3]' to parameter of type 'NSString *'".

Поэтому я попробовал это вместо этого:

    NSLog([attrString description]);

И это дает следующий вывод (I 'мы заменили содержимое строки на <snipped> для конфиденциальности) :

2012-01-19 06:49:11.307 WritePath[2475:707] <Snipped> { CTForegroundColor = "<CGColor 0x281530> [<CGColorSpace 0x22d1a0> (kCGColorSpaceDeviceRGB)] ( 0 0 0 1 )"; NSFont = "<CGFont (0x28f850): ArialMT>"; NSParagraphStyle = "CTParagraphStyle:\nwriting direction = -1, alignment = 3, line break mode = 0, default tab interval = 0\nfirst line head indent = 0, head indent = 0, tail indent = 0\nline height multiple = 0, maximum line height = 0, minimum line height = 0\nline spacing adjustment = 0, paragraph spacing = 0, paragraph spacing before = 0\ntabs:\n<CFArray 0x287b50 [0x3f229630]>{type = immutable, count = 12, values = (\n\t0 : CTTextTab: location = 28, alignment = 0, options = (none)\n\n\t1 : CTTextTab: location = 56, alignment = 0, options = (none)\n\n\t2 : CTTextTab: location = 84, alignment = 0, options = (none)\n\n\t3 : CTTextTab: location = 112, alignment = 0, options = (none)\n\n\t4 : CTTextTab: location = 140, alignment = 0, options = (none)\n\n\t5 : CTTextTab: location = 168, alignment = 0, options = (none)\n\n\t6 : CTTextTab: location = 196, alignment = 0, options = (none)\n\n\t7 : CTTextTab: location = 224, alignment = 0, options = (none)\n\n\t8 : CTTextTab: location = 252, alignment = 0, options = (none)\n\n\t9 : CTTextTab: location = 280, alignment = 0, options = (none)\n\n\t10 : CTTextTab: location = 308, alignment = 0, options = (none)\n\n\t11 : CTTextTab: location = 336, alignment = 0, options = (none)\n\n)}"; }

1 Ответ

8 голосов
/ 19 января 2012

Я заметил это в вашем дампе приписанной строки:

NSFont = "<CGFont (0x28f850): ArialMT>"

Вы создали приписанную строку, используя CGFontRef в качестве значения для клавиши kCTFontAttributeName?Вы должны использовать CTFontRef, а не CGFontRef.Они разные.

...