Converting Objective-C code to Swift: is it okay to omit release calls?

We need to convert the code from Objective-C to Swift.

Question:

There are several function calls for releasing objects, for example CGImageRelease(newImage). Is it safe to assume that analog is not needed for the Swift version, since all memory management is automatic, or do you also need to free memory in Swift?

Objective-C code:

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(imageSampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(imageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(newContext); CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);
UIImage *image= [UIImage imageWithCGImage:newImage scale:1.0 orientation:orientation];
CGImageRelease(newImage);

Quick version:

private func turnBufferToPNGImage(imageSampleBuffer: CMSampleBufferRef, scale: CGFloat) -> UIImage {
    let imageBuffer = CMSampleBufferGetImageBuffer(imageSampleBuffer)

    // Lock base address
    CVPixelBufferLockBaseAddress(imageBuffer, 0)

    // Set properties for CGBitmapContext
    let pixelData = CVPixelBufferGetBaseAddress(imageBuffer)
    let width = CVPixelBufferGetWidth(imageBuffer)
    let height = CVPixelBufferGetHeight(imageBuffer)
    let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer)
    let colorSpace = CGColorSpaceCreateDeviceRGB()

    // Create CGBitmapContext
    let newContext = CGBitmapContextCreate(pixelData, width, height, 8, bytesPerRow, colorSpace, CGImageAlphaInfo.PremultipliedFirst.rawValue)

    // Create image from context
    let rawImage = CGBitmapContextCreateImage(newContext)!
    let newImage = UIImage(CGImage: rawImage, scale: scale, orientation: .Up)

    // Unlock base address
    CVPixelBufferUnlockBaseAddress(imageBuffer,0)

    // Return image
    return newImage
}
+4
source share
2 answers

In documents:

Core Foundation Swift. , , Swift Core Foundation, Core Foundation,

, .

+7

Core Foundation, Apple :

Core Foundation CFTypeRef AnyObject .

Core Foundation, API, Swift - CFRetain, CFRelease CFAutorelease .

document

+1

All Articles