0

我有以下代码从现有的 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”上。

4

1 回答 1

0

回答我自己的问题。

似乎 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 ...
于 2015-10-21T23:22:18.910 回答