3

已实现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];
}

NSCFNumberInstruments 在可能的 Frame上报告了 16 字节的小泄漏FigRemote_CreatePropertyListFromBinaryPListData

Leaked Object # Address Size 责任库责任框架
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];

泄漏发生在选择视频并返回初始视图之后。有什么想法吗?

4

2 回答 2

1

首先,您需要确保将 包含MobileCoreServices Framework到您的 Xcode 项目中,然后#import <MobileCoreServices/MobileCoreServices.h>您可以访问预定义的媒体类型常量,例如kUTTypeImageKUTTypeMovie

然后,您需要知道该mediaType 属性需要一个数组,即使它只包含一个元素。

您放置此代码的视图控制器需要成为这两个的委托:UINavigationControllerDelegateUIImagePickerControllerDelegate

然后你可以把这段代码放在某个地方让它被执行(就像在一个按钮动作里面):

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];
于 2014-11-20T21:43:46.787 回答
1

我周围有几处泄漏UIImagePickerController,这就是其中之一。总泄漏量为 208 字节。我发现如果使用CoreFoundationC 代码指定媒体类型,这种泄漏就会消失。

所以下面的代码泄漏:

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

我的理论是泄漏语句没有提供工作代码的最终参数提供的信息。kCFTypeArrayCallBacksCFArray创建者提供正确保留和释放其包含的对象所需的信息(使用CFRetainCFRelease)。它包含的这些对象是CFStringRefs... 泄漏的语句将这些转换CFStringRefsNSStrings,我认为NSArray它在其对象上使用了 Objective-C 标准的保留和释放消息。

这个理论似乎是虚假的,因为CFArray并且NSArray是免费桥接的,它应该“正常工作”。不过,我现在坚持使用它——这是上面两个代码片段之间唯一让我印象深刻的显着区别。

于 2012-01-13T20:54:56.503 回答