пользовательский NSCursor не работает

У меня есть следующий код для установки курсора из существующего CGImage:

    NSPoint   hotspot = ...;
    CGImageRef cgimg = ...;

    if(!cgimg)
        return nullptr;
    NSImage* nsimg = [[NSImage alloc] initWithCGImage:cgimg size:NSZeroSize];
    if(!nsimg)
        return nullptr;

    NSCursor* pcur = [[NSCursor alloc] initWithImage: nsimg hotSpot: hotspot];
    if(!pcur)
        return nullptr;

    [nsimg release];

    // later in the code I set it as current:
    [pcur set];

Проблема в том, что он отображается непоследовательно, иногда он выглядит нормально, иногда показывает мусор: сломанный курсор

Я использую точно такой же CGImageRef, который отображается как обычное изображение (тот, что под полем).

Есть идеи, в чем может быть проблема?

Стоковые курсоры в том же приложении отрисовываются нормально. Это на OS X "El Capitan", если это имеет значение.


person c-smile    schedule 21.10.2015    source источник
comment
я не думаю, что вам следует звонить [nsimg release]. ARC включен по умолчанию, не так ли?   -  person Richard Hodges    schedule 22.10.2015
comment
ARC отключен в этом проекте.   -  person c-smile    schedule 22.10.2015


Ответы (1)


Отвечая на мой собственный вопрос.

Похоже, что OS X использует некоторый пул автоматического выпуска или тому подобное для хранения промежуточных результатов.

В моей реализации я создаю курсор в одном месте и использую в другом - в ответ на движение мыши. Кажется, что в этом случае OS X пытается использовать освободившуюся память.

Чтобы исправить это, я был вынужден использовать последовательность [pcur push]; [pcur pop];, чтобы убедить OS X немедленно создать курсор:

NSPoint   hotspot = ...;
CGImageRef cgimg = ...;

if(!cgimg)
    return nullptr;
NSImage* nsimg = [[NSImage alloc] initWithCGImage:cgimg size:NSZeroSize];
if(!nsimg)
    return nullptr;

NSCursor* pcur = [[NSCursor alloc] initWithImage: nsimg hotSpot: hotspot];
if(!pcur)
    return nullptr;

[nsimg release];

[pcur push]; [pcur pop]; // this is mandatory to force cursor structures to be created.

// store pcur for later use ...
person c-smile    schedule 21.10.2015