Среда:
- Xcode 10.2
- Swift 4.2
- MacOS Цель: 10.11
У меня есть следующее расширение NSImage:
extension NSImage {
func filter(filter: String) -> NSImage? {
return autoreleasepool { [weak self] () -> NSImage? in
let image = CIImage(data: (self?.tiffRepresentation!)!)
if let filter = CIFilter(name: filter) {
filter.setDefaults()
filter.setValue(image, forKey: kCIInputImageKey)
let context = CIContext(options: [CIContextOption.useSoftwareRenderer: true])
// *** 64 Byte MEMORY LEAK on line below ***
guard let imageRef = context.createCGImage(filter.outputImage!, from: image!.extent) else {
context.clearCaches()
context.reclaimResources()
return nil
}
context.clearCaches()
context.reclaimResources()
return NSImage(cgImage: imageRef, size: NSSize(width: 0, height: 0))
} else {
return nil
}
}
}
}
Инвертируемое изображение задается в InterfaceBuilder и представляет собой 16KB 480x480 png с альфа-каналом и цветовым профилем sRGB IEC61966-2.1.Я вызываю функцию «фильтра» из подкласса NSButton следующим образом:
...
override func awakeFromNib() {
....
autoreleasepool {
image = image!.filter(filter: "CIColorInvert")
}
....
}
...
Фильтр работает так, как объявлено.Тем не менее, я получаю 64-байтовую утечку памяти при защищенном вызове ' context.createCGImage '.
Вещи, которые я пробовал:
- Перемещение блока автозапуска вверх и вниз по функции фильтра
- Удаление блока автозапуска из подкласса NSButton
- Удаление одного и обоих блоков автозапуска
Аналогичные результаты: утечка памяти в 64-байтовом Malloc в строке, указанной выше.Чего мне не хватает?