UIImagePickerController mediaTypes kUTTypeMovie вызывает небольшую утечку памяти в NSCFNumber - PullRequest
3 голосов
/ 16 августа 2011

Xcode 4.0.2
iPhone4 iOS 4.3.5
Реализованы платформы CoreLocation и MobileCoreServices.
импортировано MobileCoreServices/UTCoreTypes.h

- (void) displayVideoPicker
{
    UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
    ipc.sourceType =  UIImagePickerControllerSourceTypePhotoLibrary;
    ipc.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
    ipc.videoMaximumDuration = 45.0f;
    ipc.videoQuality = UIImagePickerControllerQualityTypeMedium;
    ipc.delegate = self;
    [self presentModalViewController:ipc animated:YES];
    [ipc release];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
}

Инструменты сообщают о малых 16 байтахутечки на NSCFNumber, возможный кадр FigRemote_CreatePropertyListFromBinaryPListData:

Leaked Object   #   Address Size    Responsible Library Responsible Frame
NSCFNumber,8        128 Bytes   MediaToolbox FigRemote_CreatePropertyListFromBinaryPListData

Если я уберу эту строку, утечка исчезнет:

ipc.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];

Я пробовал это и этоне удалось избавиться от утечки.

NSArray *myMediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
ipc.mediaTypes = myMediaTypes;
[myMediaTypes release];

Утечка возникает сразу после выбора видео и возврата к исходному виду.Есть мысли?

Ответы [ 2 ]

1 голос
/ 21 ноября 2014

Сначала необходимо обязательно включить MobileCoreServices Framework в свой проект Xcode, затем #import <MobileCoreServices/MobileCoreServices.h>, который дает вам доступ к предопределенным константам типа мультимедиа, таким как kUTTypeImage и KUTTypeMovie.

* 1006.* Затем вам нужно знать, что mediaType свойство ожидает массив , даже если он содержит только один элемент.

Контроллер представления, в который вы помещаете этот код, должен быть делегатом для этих двух: UINavigationControllerDelegate и UIImagePickerControllerDelegate

Затем вы можете поместить этот код где-нибудь для его выполнения (как внутри действия кнопки):

UIImagePickerController *camera = [[UIImagePickerController alloc] init];
camera.sourceType = UIImagePickerControllerSourceTypeCamera;
camera.delegate = self;
camera.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];
[self presentViewController:camera animated:YES completion:nil];

Кроме того, в строке 4 моего кода выше, где написано camera.mediaTypes, вы также можете легко это сделать:

camera.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
1 голос
/ 14 января 2012

Я получаю пару утечек вокруг UIImagePickerController, и это была одна из них.Общая утечка составила 208 байт.Я обнаружил, что если типы носителей указаны с использованием кода CoreFoundation C, эта утечка исчезнет.

Таким образом, утечки следующего кода:

imagePickerController.mediaTypes = [NSArray arrayWithObjects:(NSString*)kUTTypeImage, (NSString*)kUTTypeMovie, nil];

Может быть заменен следующим кодом, которыйне вызывает такой же утечки:

CFStringRef mTypes[2] = { kUTTypeImage, kUTTypeMovie };

CFArrayRef mTypesArray = CFArrayCreate(CFAllocatorGetDefault(), (const void**)mTypes, 2, &kCFTypeArrayCallBacks);

imagePickerController.mediaTypes = (NSArray*)mTypesArray;

CFRelease(mTypesArray);

Моя теория состоит в том, что утечка не предоставляет информацию, которую предоставляет заключительный аргумент рабочего кода.kCFTypeArrayCallBacks предоставляет CFArray, созданный с информацией, необходимой для правильного хранения и освобождения объектов, которые он содержит (используя CFRetain и CFRelease).Эти объекты это CFStringRefs...Утверждающее утверждение приводит эти CFStringRefs к NSStrings, и я думаю, что NSArray использует стандарт Objective-C для сохранения и выпуска сообщений на своих объектах.

Эта теория может показаться фиктивной, потому что CFArrayи NSArray являются бесплатными мостами, и это должно "просто работать".Пока я придерживаюсь этого - единственное существенное различие между двумя фрагментами кода выше, которое бросается в глаза.

...