Постоянно увеличивающееся использование памяти с растровым рисунком CGContext - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь переместить содержимое подобласти в CGLayer. Основная идея заключается в том, что я сначала рисую исходную область (часть, которую я хочу переместить) во вновь созданный растровый рисунок CGContext, затем создаю из нее CGImage и рисую ее обратно на исходный слой в другом месте. Вот фрагмент кода в вопросе:

    let size = src.size

    //create the bitmap context
    UIGraphicsBeginImageContextWithOptions(size, true, 0)
    guard let ctx = UIGraphicsGetCurrentContext() else { return }
    ctx.saveGState()

    //flip the context to match the origin position of UIKit
    ctx.translateBy(x: 0, y: size.height)
    ctx.scaleBy(x: 1.0, y: -1.0)

    //draw the source part of the layer into the bitmap context
    let offset = CGPoint(x: -src.origin.x, y: -src.origin.y)
    let iRect = CGRect(origin: offset, size: self.shellBounds.size)
    let bounds = CGRect(origin: .zero, size: size)
    ctx.clip(to: bounds)
    ctx.draw(layer, in: iRect)

    //make a CGImage of the contents
    let image = ctx.makeImage()!

    //draw this part back to the layer (context is obtained from layer)
    context.saveGState()
    context.clip(to: target)
    context.setBlendMode(.copy)
    context.draw(image, in: target)
    context.restoreGState()
    ctx.restoreGState()
    UIGraphicsEndImageContext()

Это работает как ожидалось. Однако проблема в том, что использование памяти продолжает увеличиваться при каждом вызове.

Увеличение памяти, вероятно, связано с созданием изображения. Но, похоже, не выпущен в конце. Что не так с моим фрагментом кода? Нужно ли выпускать созданное изображение вручную? Если да, то как я могу это сделать, поскольку Swift использует ARC для Core Graphics, как указано в документации?

1 Ответ

0 голосов
/ 19 сентября 2018

Оказывается, проблема с памятью начинается при повторном рисовании сгенерированного изображения в слой (когда часть, которая рисует сгенерированное изображение обратно в слой, закомментируется, память никогда больше не увеличивается).

Так какВнутренняя реализация CGLayer неизвестна, трудно узнать точную причину этой проблемы.Я только отказался от этого метода и реализовал его по-другому.

...