Нужен ли CFRelease, если я использую CGImageSourceCreateWithData из (__bridge)? - PullRequest
3 голосов
/ 28 февраля 2012

Мой вопрос очень прост, я хотел бы знать, если метод "CGImageSourceCreateWithData" создает новый объект, копирующий данные, которые я предоставляю, так что я должен выпустить их, когда они мне не нужны больше или если он просто создаст ссылку на данные, которые у меня уже есть, так что, если я их опубликую, я потеряю эти данные (и, возможно, у них будут ошибочные ошибки доступа).

Проблема связана с использованием (__bridge CFDataRef) в качестве исходных данных. Что позволило мне использовать базовые базовые объекты как бесплатные в режиме ARC.

Рассмотрим следующую функцию (или метод, не знаю, как она вызывается):

- (void)saveImageWithData:(NSData*)jpeg andDictionary:(NSDictionary*)dicRef andName:(NSString*)name
{
    [self setCapturedImageName:name];

    CGImageSourceRef  source ;

    // Notice here how I use __bridge
    source = CGImageSourceCreateWithData((__bridge CFDataRef)jpeg, NULL);

    CFStringRef UTI = CGImageSourceGetType(source); 

    NSMutableData *dest_data = [NSMutableData data];

    // And here I use it again
    CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)dest_data,UTI,1,NULL);

    CGImageDestinationAddImageFromSource(destination,source,0, (__bridge CFDictionaryRef) dicRef);

    BOOL success = NO;
    success = CGImageDestinationFinalize(destination);

    if(!success) {
        NSLog(@"***Could not create data from image destination ***");
    }

    // This only saves to the disk
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"ARPictures"];

    NSError *error;
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder

    NSString *fullPath = [dataPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg", name]]; //add our image to the path

    [dest_data writeToFile:fullPath atomically:YES];


    self.img = [[UIImage alloc] initWithData:dest_data]; 
    self.capturedImageData = [[NSData alloc] initWithData:dest_data];

    //This is what im not sure if i should use
    CFRelease(destination);
    CFRelease(source);

}

Меня беспокоит утечка памяти или то, что я не должен делать.

Спасибо

1 Ответ

7 голосов
/ 28 февраля 2012

Вы делаете это правильно. На самом деле не имеет значения, делают ли эти процедуры копии или нет. Важно то, что вы CFRelease то, что вы «создаете» (или «копируете»). Здесь все выглядит правильно. __bridge подходит для передачи параметров, потому что вы фактически не переносите объект из CF в Cocoa или наоборот. Вы просто временно «соединяете» (кастинг) это.

...