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); 

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, 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

согласно документации: типы

Основной фонд автоматически импортируются как полноценные Swift классов , Везде, где были представлены аннотации управления памятью, Swift автоматически управляет памятью объектов ядра фонда, в том числе объектов Основного фонда, который вы Instantiate себя

Таким образом, вы можете пропустить звонки.

+0

совершенны, просто хотел, чтобы подтвердить! благодаря! – Crashalot

1

Нет Вам не нужно освободить сердечника объект Foundation, потому что Apple, сказал:

Тип сердечника Фонд CFTypeRef полностью перераспределяет в AnyObject типа.

И

объекты Основной фонд вернулся из аннотированных API, автоматически памяти, управляемой в Swift-вам не нужно вызывать CFRetain, CFRelease или CFAutorelease функции самостоятельно.

документ here