2016-03-30 7 views
4

以下のコードをObjective-CからSwiftに変換する必要があります。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); 

スウィフトバージョン:ドキュメント毎の

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 
} 

答えて

7

Core Foundationのタイプは自動的に本格的なスウィフトクラスとしてインポートされます。メモリ管理アノテーションが提供されている場所では、Swiftは自分自身をインスタンス化するCore Foundationオブジェクトなどのメモリを自動的に管理します。

コールを省略することができます。

+0

完璧な文書は、ちょうど確認したかったです!ありがとう! – Crashalot

1

ありませんあなたは Appleが言ったので、Core Foundationのオブジェクトを解放する必要はありません。

Core FoundationのCFTypeRef型が完全にANYOBJECT 型に再マップします。

そして

Core Foundationのオブジェクトが自動的に管理 メモリされている注釈付きのAPIから返さスウィフト - あなたはCFRetain、 CFReleaseを起動する必要はありません、またはCFAutoreleaseは自分で機能します。

here

関連する問題