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];
在选择视频并返回初始视图后发生泄漏。有什么想法吗?
答案 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
提供了正确保留和释放其包含的对象所需的信息(使用CFRetain
和CFRelease
)。它包含的这些对象是CFStringRefs..
。泄漏语句将这些CFStringRefs
强制转换为NSStrings
,我认为NSArray
正在使用Objective-C标准保留和释放其对象上的消息。
这个理论似乎是假的,因为CFArray
和NSArray
是免费的桥接,它应该“正常工作”。我现在坚持使用它 - 这是上面两个代码片段之间的唯一重要区别,它突然出现在我身上。
答案 1 :(得分:1)
首先,您需要确保将MobileCoreServices Framework
包含在Xcode项目中,然后#import <MobileCoreServices/MobileCoreServices.h>
,这样您就可以访问预定义的媒体类型常量,例如kUTTypeImage
和{{1 }}
然后,您需要知道KUTTypeMovie
属性需要数组,即使它只包含一个元素。
您输入此代码的视图控制器需要成为这两个代理:mediaType
和UINavigationControllerDelegate
然后你可以将这段代码放在某个地方让它被执行(比如在按钮动作中):
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