UIImagePickerController mediaTypes kUTTypeMovie导致NSCFNumber中的小内存泄漏

时间:2011-08-15 22:15:17

标签: iphone memory memory-leaks uiimagepickercontroller xcode-instruments

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];
}

仪器在NSCFNumber上报告小的16字节泄漏,可能的框架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 个答案:

答案 0 :(得分:1)

我在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提供了正确保留和释放其包含的对象所需的信息(使用CFRetainCFRelease)。它包含的这些对象是CFStringRefs..。泄漏语句将这些CFStringRefs强制转换为NSStrings,我认为NSArray正在使用Objective-C标准保留和释放其对象上的消息。

这个理论似乎是假的,因为CFArrayNSArray是免费的桥接,它应该“正常工作”。我现在坚持使用它 - 这是上面两个代码片段之间的唯一重要区别,它突然出现在我身上。

答案 1 :(得分:1)

首先,您需要确保将MobileCoreServices Framework包含在Xcode项目中,然后#import <MobileCoreServices/MobileCoreServices.h>,这样您就可以访问预定义的媒体类型常量,例如kUTTypeImage和{{1 }}

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

您输入此代码的视图控制器需要成为这两个代理:mediaTypeUINavigationControllerDelegate

然后你可以将这段代码放在某个地方让它被执行(比如在按钮动作中):

UIImagePickerControllerDelegate

此外,在我上面的代码的第4行UIImagePickerController *camera = [[UIImagePickerController alloc] init]; camera.sourceType = UIImagePickerControllerSourceTypeCamera; camera.delegate = self; camera.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie]; [self presentViewController:camera animated:YES completion:nil]; ,您也可以轻松地执行此操作:

camera.mediaTypes