Вы, вероятно, не должны хранить возвращаемое значение из UIGraphicsGetCurrentContext
в свойстве. Обычно вы либо не знаете, как долго будет действовать контекст, либо у контекста все равно будет короткое время жизни. Например, если вы вызываете UIGraphicsGetCurrentContext
из вашего drawRect:
метода, вы не знаете, как долго этот контекст проживет после возврата из drawRect:
. Если вы звоните UIGraphicsGetCurrentContext
после звонка UIGraphicsBeginImageContextWithOptions
, вы, вероятно, скоро все равно позвоните UIGraphicsEndImageContext
. Было бы неуместно хранить ссылки на эти контексты вокруг.
Если вы вызываете множество функций Core Graphics в одном и том же контексте, вы хотите сохранить контекст в локальной переменной. Например, вот метод drawRect:
из одного из моих тестовых проектов:
- (void)drawRect:(CGRect)dirtyRect {
NSLog(@"drawRect:%@", NSStringFromCGRect(dirtyRect));
[self layoutColumnsIfNeeded];
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSaveGState(gc); {
// Flip the Y-axis of the context because that's what CoreText assumes.
CGContextTranslateCTM(gc, 0, self.bounds.size.height);
CGContextScaleCTM(gc, 1, -1);
for (NSUInteger i = 0, l = CFArrayGetCount(_columnFrames); i < l; ++i) {
CTFrameRef frame = CFArrayGetValueAtIndex(_columnFrames, i);
CGPathRef path = CTFrameGetPath(frame);
CGRect frameRect = CGPathGetBoundingBox(path);
if (!CGRectIntersectsRect(frameRect, dirtyRect))
continue;
CTFrameDraw(frame, gc);
}
} CGContextRestoreGState(gc);
}
Вы можете видеть, что я делаю кучу вещей с контекстом: я сохраняю и восстанавливаю графическое состояние, я изменяю CTM, и я рисую некоторые кадры Core Text в нем. Вместо многократного вызова UIGraphicsGetCurrentContext
, я вызываю его всего один раз и сохраняю результат в локальной переменной с именем gc
.