2012-01-14 3 views
0

CLLocationCoordinate2Dの値を保持するためにNSMutableArrayを使用しています。数分のテストの後、私はアプリがクラッシュするのを発見した。配列とCLLocationCoordinate2Dの値の両方に関連した重いメモリリークが見つかりました。ここでCLLocationCoordinate2Dを使用しているときのメモリリーク

は、コードは次のとおりです。

NSMutableArray *arrayReturn = [[NSMutableArray alloc] init]; 
CLLocationCoordinate2D obj1 = CLLocationCoordinate2DMake(37.6085289,107.5941445); 
CLLocationCoordinate2D obj2 = CLLocationCoordinate2DMake(27.1727738,78.041655); 

[arrayReturn addObject:[NSValue valueWithBytes:&obj1 objCType:@encode(CLLocationCoordinate2D)]]; 
[arrayReturn addObject:[NSValue valueWithBytes:&obj2 objCType:@encode(CLLocationCoordinate2D)]]; 

return [arrayReturn autorelease]; 

私はこのような複数のオブジェクトを作成し、配列に追加しています。私は最後に自動リリースをタグ付けしていますが、配列に重いメモリリークがあります。

私はここで間違っていますか?

+0

あなたのアプリはクラッシュしますか?それはどこでクラッシュするのですか?あなたはどのようにしてメモリリークがあると判断しましたか? –

答えて

0

CLLocationCoordinate2DはNSObjectではなく2つのdouble値の単純な構造体です!

スタックにCLLocationCoordinate2Dを割り当て、そのデータへのポインタをNSValueオブジェクトに渡します。しかし、スタックメモリは、メソッドが返った後は利用できません。これはあなたのアプリがクラッシュする理由です。

何らかの形でCLLocationCoordinate2DをNSObjectに変換する必要があります。 例:

NSArray* coords = [NSArray arrayWithObjects:[NSNumber numberWithDouble:obj1.latitude], [NSNumber numberWithDouble:obj1.longitude], nil]; 
+0

valueWithBytes:objCType:渡されたコンテンツのコピーとそのエンコード方法に関する情報を含むNSValueオブジェクトを作成します。このルーチンのポイントは、CLLocationCordinate2DをNSObjectのサブクラスであるNSValueに変換し、難なくNSArrayに入れることができるようにすることです。 – gaige

+0

@gaige大丈夫、私はそれについて知らなかった。コメントありがとう! – Felix

+0

私はこれらのCLLocationCoordinate2Dアドレスをそれぞれ解放する必要がありますか? –

関連する問題