2016-03-30 1 views
4

Nous devons convertir le code ci-dessous d'Objective-C en Swift.Conversion du code Objective-C en Swift: peut-on omettre les appels de libération?

Question:

Il y a quelques appels de fonctions pour libérer des objets, par exemple, CGImageRelease(newImage). Est-il prudent de supposer qu'aucun analogue n'est nécessaire pour la version Swift puisque toute la gestion de la mémoire est automatique, ou avez-vous besoin de libérer de la mémoire dans Swift?

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

Version Swift jusqu'à présent:

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 
} 

Répondre

7

par les docs:

de base types Fondation sont automatiquement importés comme à part entière des classes Swift . Partout où des annotations de gestion de la mémoire ont été fournies, Swift gère automatiquement la mémoire des objets Core Foundation, y compris les objets Core Foundation que vous instanciez vous-même

Vous pouvez donc ignorer les appels.

+0

parfait, je voulais juste confirmer! Merci! – Crashalot

1

Non Vous n'avez pas besoin de libérer de base objet Foundation parce Apple a déclaré:

Type Core Foundation CFTypeRef reconfigure complètement au type de ANYOBJECT .

Et

base Fondation objets retournés des API annotés sont automatiquement mémoire gérée à Swift-vous n'avez pas besoin d'invoquer la CFRetain, CFRelease, ou vous CFAutorelease les fonctions.

Document here