3

Xcode 4.0.2
iPhone4
iOS4.3.5CoreLocationおよび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];
}

NSCFNumberInstrumentsは、フレームの可能性がある16バイトの小さなリークを報告していFigRemote_CreatePropertyListFromBinaryPListDataます。

リークされたオブジェクト#アドレスサイズ責任のあるライブラリ責任のあるフレーム
NSCFNumber、8128バイトMediaToolboxFigRemote_CreatePropertyListFromBinaryPListData

この行を削除すると、リークはなくなります。

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

私はこれを試しましたが、リークは解消されませんでした。

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

リークは、ビデオを選択して最初のビューに戻った直後に発生します。何かご意見は?

4

2 に答える 2

1

の周りでいくつかの漏れが発生していUIImagePickerControllerますが、これはそのうちの 1 つです。リークの合計は 208 バイトでした。CoreFoundationC コードを使用してメディア タイプを指定すると、このリークがなくなることがわかりました。

したがって、次のコードがリークします。

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をキャストし、 Objective-C 標準の保持および解放メッセージをオブジェクトに使用しているNSStringsと思います。NSArray

とは無料でブリッジされており、「うまく機能する」はずなのでCFArray、この理論は偽物に思えます。NSArray私は今のところそれに固執しています-それは私が飛び出す上記の2つのコードスニペットの唯一の重要な違いです.

于 2012-01-13T20:54:56.503 に答える
1

MobileCoreServices Framework最初に、Xcode プロジェクトに を確実に含める必要があります。#import <MobileCoreServices/MobileCoreServices.h>これにより、 や などの事前定義されたメディア タイプ定数にアクセスできるようにkUTTypeImageなりKUTTypeMovieます。

次に、要素が 1 つしか含まれていない場合でも、mediaType プロパティには配列が必要であることを知っておく必要があります。

このコードを配置するビュー コントローラーは、次の 2 つのデリゲートである必要がありますUINavigationControllerDelegateUIImagePickerControllerDelegate

次に、このコードをどこかに配置して実行することができます (ボタン アクション内など)。

UIImagePickerController *camera = [[UIImagePickerController alloc] init];
camera.sourceType = UIImagePickerControllerSourceTypeCamera;
camera.delegate = self;
camera.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie];
[self presentViewController:camera animated:YES completion:nil];

また、上記のコードの 4 行目ではcamera.mediaTypes、これも簡単に実行できます。

camera.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
于 2014-11-20T21:43:46.787 に答える