Merge pull request #344 from kradalby/write-jpeg-memory-leak

Force cleanup of objects in write_jpeg (fix memory leak)
This commit is contained in:
Rhet Turnbull
2021-01-09 08:47:35 -08:00
committed by GitHub

View File

@@ -6,6 +6,7 @@
import pathlib import pathlib
import objc
import Metal import Metal
import Quartz import Quartz
from Cocoa import NSURL from Cocoa import NSURL
@@ -20,6 +21,7 @@ class ImageConversionError(Exception):
pass pass
class ImageConverter: class ImageConverter:
""" Convert images to jpeg. This class is a singleton """ Convert images to jpeg. This class is a singleton
which will re-use the Core Image CIContext to avoid which will re-use the Core Image CIContext to avoid
@@ -67,6 +69,12 @@ class ImageConverter:
ImageConversionError if error during conversion ImageConversionError if error during conversion
""" """
# Set up a dedicated objc autorelease pool for this function call.
# This is to ensure that all the NSObjects are cleaned up after each
# call to prevent memory leaks.
# https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html
# https://pyobjc.readthedocs.io/en/latest/api/module-objc.html#memory-management
with objc.autorelease_pool():
# accept input_path or output_path as pathlib.Path # accept input_path or output_path as pathlib.Path
if not isinstance(input_path, str): if not isinstance(input_path, str):
input_path = str(input_path) input_path = str(input_path)
@@ -103,7 +111,10 @@ class ImageConverter:
output_options = NSDictionary.dictionaryWithDictionary_( output_options = NSDictionary.dictionaryWithDictionary_(
{"kCGImageDestinationLossyCompressionQuality": compression_quality} {"kCGImageDestinationLossyCompressionQuality": compression_quality}
) )
_, error = self.context.writeJPEGRepresentationOfImage_toURL_colorSpace_options_error_( (
_,
error,
) = self.context.writeJPEGRepresentationOfImage_toURL_colorSpace_options_error_(
input_image, output_url, output_colorspace, output_options, None input_image, output_url, output_colorspace, output_options, None
) )
if not error: if not error: