我有以下代码从现有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"如果重要的话。
答案 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 ...