NSString drawAtPoint Сбой на iPhone (NSString drawAtPoint) - PullRequest
1 голос
/ 02 апреля 2010

Эй. У меня есть очень простой текстовый вывод в буферную систему, которая будет зависать случайным образом. Это будет хорошо в течение ДНЕЙ, тогда иногда это терпит крах несколько раз через несколько минут. Callstack почти точно такой же для других парней, которые используют элементы управления более высокого уровня: http://discussions.apple.com/thread.jspa?messageID=7949746 Сбой приложения для iPhone: функция подтверждения не выполнена evict_glyph_entry_from_strike, файл Fonts / CGFontCache.c

Вылетает на линии (также ниже в drawTextToBuffer ()): [nsString drawAtPoint: CGPointMake (0, 0) withFont: clFont];

У меня тот же вызов "evict_glyph_entry_from_cache" с вызовами прерывания сразу после него.

Видимо, это происходит с другими людьми. Я могу сказать, что мой NSString * прекрасно работает во время аварии. Я могу читать текст из отладчика просто отлично.

static CGColorSpaceRef curColorSpace;
static CGContextRef myContext;
static float w, h;
static int iFontSize;
static NSString* sFontName;
static UIFont* clFont;
static int iLineHeight;

unsigned long* txb; /* 256x256x4 Buffer */


void selectFont(int iSize, NSString* sFont)
{
    iFontSize = iSize;
    clFont = [UIFont fontWithName:sFont size:iFontSize];
    iLineHeight = (int)(ceil([clFont capHeight]));
}


void initText()
{
    w = 256;
    h = 256;

    txb = (unsigned long*)malloc_(w * h * 4);

    curColorSpace = CGColorSpaceCreateDeviceRGB();
    myContext = CGBitmapContextCreate(txb, w, h, 8, w * 4, curColorSpace, kCGImageAlphaPremultipliedLast);

    selectFont(12, @"Helvetica");
}

void drawTextToBuffer(NSString* nsString)
{
    CGContextSaveGState(myContext);
    CGContextSetRGBFillColor(myContext, 1, 1, 1, 1);
    UIGraphicsPushContext(myContext);

    /* This line will crash.  It crashes even with constant Strings..   At the time of the crash, the pointer to nsString is perfectly fine.  The data looks fine! */
    [nsString drawAtPoint:CGPointMake(0, 0) withFont:clFont];
    UIGraphicsPopContext();
    CGContextRestoreGState(myContext);
}

Это будет происходить с другими методами, не поддерживающими Юникод, такими как CGContextShowTextAtPoint (); стек вызовов аналогичен этому.

Это какая-то известная проблема с iPhone? Или, может быть, что-то вне этой причины вызывает исключение в этом конкретном вызове (drawAtPoint)?

1 Ответ

2 голосов
/ 02 апреля 2010
void selectFont(int iSize, NSString* sFont)
{
    iFontSize = iSize;
    clFont = [UIFont fontWithName:sFont size:iFontSize];
    iLineHeight = (int)(ceil([clFont capHeight]));
}

После вызова этой функции clFont будет автоматически освобожден, поэтому нет гарантии, что контекст, не относящийся к этой функции, все еще может иметь действительный clFont. Вам нужно -retain экземпляр, если вы планируете использовать его позже.

void selectFont(int iSize, NSString* sFont)
{
    iFontSize = iSize;
    [clFont release];
    clFont = [[UIFont fontWithName:sFont size:iFontSize] retain];
    iLineHeight = (int)(ceil([clFont capHeight]));
}
...