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
使用正确保留和释放其包含的对象所需的信息创建(使用 CFRetain
和 CFRelease
)。它包含的这些对象是 CFStringRefs..
。泄露的声明转换了这些 CFStringRefs
至NSStrings
我认为NSArray
在其对象上使用 Objective-C 标准保留和释放消息。
这个理论似乎是假的,因为 CFArray
和NSArray
是免费桥接的,它应该“正常工作”。不过,我现在坚持使用它 - 这是上面两个代码片段之间唯一让我注意到的显着差异。
关于iphone - UIImagePickerController mediaTypes kUTTypeMovie 导致 NSCFNumber 中出现少量内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071445/