gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:58:36 27 4
gpt4 key购买 nike

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 FrameNSCFNumber,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com