我使用Core Graphic
库在方法UIView
下绘制drawRect
。我们知道,在这种方法下,我们首先得到上下文:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
}
我经常使用辅助方法绘图。所以,在辅助方法中,我应该将此上下文作为参数。例如:
- drawCircle:(CGContextRef)context center:(int)center radius:(int)radius {
// drawing here
}
或者我们稍后可以在辅助函数中获取上下文变量:
- drawCircle: center:(int)center radius:(int)radius {
CGContextRef context = UIGraphicsGetCurrentContext();
// drawing here
}
我已经过测试,经常看不到任何问题。但我很害怕,当我调用另一种方法时,会发生一些变化,UIGraphicsGetCurrentContext()
会返回不同的上下文变量。那么以第二种方式做是否安全?因为它会让我的代码更清晰。如果错了,请告诉我在什么情况下会出错?
谢谢:)
答案 0 :(得分:2)
好问题。我在UIGraphicsGetCurrentContext的文档中注意到它说:
默认情况下,当前图形上下文为零。在致电之前 drawRect:方法,视图对象将有效的上下文推送到 堆叠,使其成为当前。如果您没有使用UIView对象 但是,您的绘图必须将有效的上下文推送到堆栈中 手动使用UIGraphicsPushContext函数。
在iOS 4及更高版本中,您可以从您的任何线程调用此函数 应用
听起来最后一句话暗示这个函数是线程安全的,通常看起来像线程你担心如果你在不同的地方访问相同的函数或属性你可能会访问不同的东西或他们可能无法正确同步,因此您可能会从两个不同的地方获得不同的信息。
我认为如果它暗示这个函数是线程安全的,那么如果你从一个不同的函数访问它就不重要,因为它应该给你相同的结果,特别是如果你甚至不是使用线程,所以这可能更偏好?
也就是说,在该引文的第1段中,第二句提到手动将有效上下文推入堆栈。如果你在传递上下文的地方编写drawCircle代码,你似乎有更多的灵活性,因为你可以传递不同的上下文(如果由于某种原因有帮助)但是如果你硬编码你只能使用UIGraphicsGetCurrentContext()返回的默认上下文