1

Appleの「iOS用カメラプログラミングトピック」ガイドのコードを次のように使用しました。

UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

// Displays a control that allows the user to only take picture:
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];

// Hides the controls for moving & scaling pictures, or for trimming movies. To instead show the controls, use YES.
cameraUI.allowsEditing = NO;

cameraUI.delegate = delegate;

[controller presentModalViewController: cameraUI animated: YES];
[cameraUI release];

ただし、コードを「分析」すると、Xcodeは次の行からリークが発生する可能性があると言います。

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

release上記以外のコマンドはありません。問題の配列がcameraUI(リリースされている)の属性であるとすると、(もしあれば)何をすべきかわかりません。

何かご意見は?

4

1 に答える 1

1

cameraUI.mediaTypesプロパティがで定義されていない限りassign、ここには確かにリークがあります。指示のためだけに、行を複数のステップに分割すると役立つ場合があります。

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

cameraUI独自のメモリを処理する場合は、何をいつ割り当てるかは問題ではありません。しかし、その最初の行では、変数を作成していますが、解放することはありません。では、これをどのように修正しますか?それを修正する標準的な方法は、建設中に自動解放することです。

cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];

できるだけ早く解放する必要がある非常に大きなオブジェクトを操作している場合は、次の場所に渡されたら手動で解放する必要がありますcameraUI

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
[mediaTypes release];

2番目の形式は、必要な場合にのみ使用してください。エラーが発生しやすくなります。

于 2012-04-15T13:47:30.757 に答える