iphone - UIImagePickerController mediaTypes kUTTypeMovie 导致 NSCFNumber 中出现少量内存泄漏

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

Instruments 报告 NSCFNumber 上存在 16 字节小泄漏,可能的帧 FigRemote_CreatePropertyListFromBinaryPListData:

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

If I remove this line the leak goes away:

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

我已经尝试过这个方法,但并没有消除泄漏。

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

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

最佳答案

我在 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.. 。泄露的声明转换了这些 CFStringRefsNSStrings我认为NSArray在其对象上使用 Objective-C 标准保留和释放消息。

这个理论似乎是假的,因为 CFArrayNSArray是免费桥接的,它应该“正常工作”。不过,我现在坚持使用它 - 这是上面两个代码片段之间唯一让我注意到的显着差异。

关于iphone - UIImagePickerController mediaTypes kUTTypeMovie 导致 NSCFNumber 中出现少量内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071445/

相关文章:

iphone - Objective-c UIImage 存储在 MSMutableArray 替代方案中,潜在的内存泄漏?

haskell - 为什么将 Data.Binary.Put monad 更改为转换器会导致内存泄漏?

iphone - iOS view.hidden = NO 并不总是有效

ios - NSData 和 UIImage

iphone - 停止在后台线程和运行循环中执行动画

Python处理字节相关对象的内存使用

iphone - Apple 推送通知服务 - 设备上没有通知

javascript - 最有效的数据存储方式

ios - 图片太多,应用程序太大

java - 使用 Eclipse MAT 无法找到由 Array Object 创建的内存泄漏