我们需要将以下代码从Objective-C转换为
Swift.
题:
有一些函数调用来释放对象,例如CGImageRelease(newImage).是否可以安全地假设Swift版本不需要模拟,因为所有内存管理都是自动的,或者你是否需要在Swift中释放内存?
Objective-C代码:
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);
到目前为止Swift版本:
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,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 }
解决方法
根据文档:
Core Foundation types are automatically imported as full-fledged Swift classes. Wherever memory management annotations have been provided,Swift automatically manages the memory of Core Foundation objects,including Core Foundation objects that you instantiate yourself
所以你可以省略这些电话.