自定义NSCursor坏了

时间:2015-10-21 20:07:35

标签: c++ objective-c macos 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];

问题是它渲染不一致,有时看起来不错,有时会显示垃圾: broken cursor

我使用完全相同的CGImageRef作为普通图像(框下方的那个)呈现正常。

知道问题可能是什么?

同一应用程序中的库存游标呈现正常。那是在OS X" El Capitan"如果重要的话。

1 个答案:

答案 0 :(得分: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 ...