Objective c NSView&x27;s的绘图上下文

Objective c NSView&x27;s的绘图上下文,objective-c,macos,cocoa,core-graphics,quartz-2d,Objective C,Macos,Cocoa,Core Graphics,Quartz 2d,从-drawRect:获取NSView的CGContext并在以后执行更多绘图是否安全?在这样一个简单的测试中: CGContextRef context = NULL; - (void)drawRect:(NSRect)r { if (!context) context = [[NSGraphicsContext currentContext] graphicsPort]; } - (void)drawSomething { CGContextSetRGBF

-drawRect:
获取NSView的CGContext并在以后执行更多绘图是否安全?在这样一个简单的测试中:

CGContextRef context = NULL;

- (void)drawRect:(NSRect)r
{
    if (!context)
        context = [[NSGraphicsContext currentContext] graphicsPort];
}

- (void)drawSomething
{
    CGContextSetRGBFillColor(context, 1, 0, 0, 1);
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100));
    CGContextFlush(context);
}
调用
-drawSomething
时,一切似乎都正常,但是否保证上下文不会更改


正如您所看到的和可能猜到的,我正在尝试使用
-drawRect:
绕过标准的绘图方式。它在很多场合都能很好地工作,但在我的特殊情况下,一种更加程序化的绘图方式会使生活更轻松。

你不应该这样做。不能保证上下文存在于
drawRect:
之外,而且您的绘图代码正在工作这一事实是一个令人高兴的意外。不要依赖这种行为


如果需要在任意点强制绘图,应在视图上调用
display
,该视图将依次调用
drawRect:

如果要在
drawRect:
外部绘图,则需要使用
lockFocus:
以下是以下文件的摘录:

如果你不使用显示器。。。方法来绘制NSView对象,您可以 必须在调用将命令发送到的方法之前调用lockFocus 窗口服务器,并且必须使用unlockFocus消息来平衡它 完成后

隐藏或缩小一次性窗口会导致备份存储 这个窗口将被释放。如果不使用标准显示器 绘制时,应使用lockFocusIfCanDraw而不是 锁定焦点,如果在窗口处于 小型化或隐藏的


当您第一次处理NSGraphicsContext时,很难理解这一点。谢谢你的回答,并向许多人指出这一点!