2012-04-15 5 views
1

私はガイドをAppleの「iOS用カメラプログラミングに関するトピック」からいくつかのコードを使用しています次の行から漏出:メモリリークが

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

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

どのような考えですか?

答えて

1

cameraUI.mediaTypesプロパティがassignで定義されていない限り、ここには実際にリークがあります。それは、指示のためだけに、複数のステップにラインを分割するのに役立ちます。 cameraUIは、独自のメモリの世話をする場合は

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

、あなたが割り当てた場合、またはどのような問題ではないはず。しかし、その最初の行では、変数を作成していますが、それを解放することはありません。だから、どうやってこれを修正するのですか?それを修正するための標準的な方法は、構築中にオートレリースすることです。

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

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

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

のみ使用します必要な場合は2番目のフォーム - エラーが発生しやすくなります。

+0

Ahhが理解しました。うん、それは働いている。しかし、クイック質問...なぜ2番目のフォーム(私はこれと同様のコードを私のアプリ全体に似ている)エラーの影響を受けやすいです。 –

+0

2番目の書式は書いたときにうまくいきますが、プログラムが大きくなると、割り当てと解放の間にコード行を入れるのは簡単です。そしてある時点で、誤ってリリースを削除するか、それをifステートメントに移動します。最初のバージョンは、誤って壊れることがずっと難しいです。一方、自動解放プールにすべてを置くと、プールが空になる前にメモリ不足になってしまう可能性があります。 – Dondragmer

+0

ahhはい - すべて意味が成り立ちます。だから人間の誤りに敏感です!ありがとう –