2011-11-12 10 views
2

Instrument Leaksツールをまったく理解していないか、怒っています。私は、私のiPhoneアプリでツールを実行して、それはいくつかのリークを示しています。私が正しく理解していれば、リークの1つとして、メソッド "writeHeading"によって割り当てられたNSDateオブジェクトであると言います。オブジェクトを割り当てるメソッドは、 "dateWithTimeIntervalSinceReferenceDate:"です。しかし、私のwriteHeadingメソッドはそのメソッドを使用しません。実際、この方法は私のアプリケーション全体では使用されていません。Instruments Leaksは存在しないメソッド呼び出しを示します

誰もが何が起こっているのか考えていますか?ここで

はwriteHeadingのコードです:ここで

- (void) writeHeading:(CLHeading *)heading 
{ 
    if (self.inFlight) { 
     [log writeHeading:heading]; 
    } else { 
     IGC_Event *event = [[IGC_Event alloc] init]; 
     event.code = 'K'; 
     event.timestamp = heading.timestamp;  
     event.heading = heading; 
     [self addEvent:event]; 
     [event release]; 
    } 
} 

は、楽器のスクリーンショットです: enter image description here

そして、ここではIGC_Event(複数応答で尋ねたとして)の定義である:

@interface IGC_Event : NSObject { 
    int code; 
    CLLocation *location; 
    CLHeading *heading; 
    NSString *other; 
    NSDate *timestamp; 
} 

@property int code; 
@property (nonatomic, retain) CLLocation *location; 
@property (nonatomic, retain) CLHeading *heading; 
@property (nonatomic, retain) NSString *other; 
@property (nonatomic, retain) NSDate *timestamp; 

@end 


@implementation IGC_Event 

@synthesize code; 
@synthesize location; 
@synthesize heading; 
@synthesize other; 
@synthesize timestamp; 

@end 
+0

IGC_Eventは、deallocメソッドでタイムスタンプと見出しを解放しますか? –

+0

する必要があります。 IGC_Eventタイムスタンプは、合成ゲッターとセッターを持つプロパティです。 – fishinear

+0

をクリアするための質問にIGC_Eventの定義を追加しますが、あなたはdeallocでそれらを解放していますか?deallocメソッドを含めることはできますか? –

答えて

1

ARCがないと仮定すると、IGC_Eventオブジェクトがタイムスタンプや保持またはコピーされた可能性のある他の参照を解放するようにする必要があります。あなたはそれをリリースしているべき場所

- (void) dealloc { 

    [timestamp release]; 
    [location release]; 
    [heading release]; 
    [other release]; 


    [super dealloc]; 
} 

リークだけではない、そのタイムスタンプオブジェクトが作成されたあなたを語っている:

だからIGC_Eventにあなたはこのようにdealloc何かを必要としています。

これはもちろん、あなたが漏れている唯一の場所ではないかもしれませんが、そこには4つの潜在的な漏れがあります。

+0

ダーン、あなたは完全に正しいです。私の考えでは、XCode 4の新しい自動保持管理を古い方法と混在させました。まだ新しい方法に切り替えていないので、私は自分のリリースを行うべきです。どうもありがとう – fishinear

0

IGC_Eventクラスの実装がありますか?そのtimestampプロパティのセッターがdateWithTimeIntevalSinceReferenceDate:を呼び出す可能性はありますか? (これは、タイムスタンプがクラスNSDateであり、サブクラスではなく、渡されたタイムスタンプから独立していることを保証します)

(免責事項:私はObjective-Cの-ERの本当にあまりないんだけど、これは愚かな質問のように思えるなら、それはおそらくです。!)

+0

それは確かに愚かな質問ではなく、IGC_Eventがそのように定義されていれば、それは問題であったかもしれません。しかし、IGC_Eventのタイムスタンプは、合成されたセッターとゲッターを持つNSDate *タイムスタンプの@property(nonatomic、retain)です。特別なものはありません。 – fishinear

1

コンパイラがコードを実行すると、方法がありますあなたのスクリーンショットには小さな人物が横たわっているあなた自身が直接呼び出し、次に結果としてコアフレームワークで呼び出されるメソッドを呼び出します。あなたが望んでいた場合は、このプロセスを自分で管理することができ

event.timestamp = heading.timestamp; 

:コードのこの部分からの質問の結果のメソッドちなみに

NSDate *eventTimestamp = heading.timestamp; 
event.timestamp = eventTimestamp; 

は、そのタイムスタンプを格納することは、完全に冗長であり、以来、不要なメモリを使用しています見出しはevent.headingにすべてのプロパティと共に格納するので、いつでもevent.heading.timestampでそのタイムスタンプにアクセスできます。しかし、それを別々に保存する理由があるかもしれません。

+0

ありがとうございます。私はそれをあなたのショーのように書き直しました、そして今、あなたの2つの行の最初にdateWithTimeIntervalSinceReferenceDateが表示されます。 dateWithTimeIntervalSinceReferenceDateコールがどこから来たのか考えていますか? タイムスタンプの保存は重複していますが、これは簡単です。IGC_Eventは、タイムスタンプ自体を持たないCLHeading以外のオブジェクトも保存できます。 – fishinear

+0

おそらく、これはNSDateオブジェクトがコピーされるたびに呼び出されるか、CLHeadingタイムスタンプはNSDateオブジェクトではなく、1つに割り当てられるが、それを達成するためにこれらのメソッド呼び出しを必要とする日付型であることが考えられます。いずれにしても、無視しても問題ない実装の詳細です。 :) –

+0

あなたが正しいと思います。たぶん、CLHeadingタイムスタンプゲッターがコンパイラなどでインライン展開されているかもしれません。だから、私はそれが漏れるタイムスタンプを使って何をするかに集中する必要があると思う。 – fishinear

関連する問題